0

I'm having trouble with creating an animation of a square that will move at a certain speed when one of the arrow keys are pressed. I have implemented both of the keyPressed, and the actionPerformed methods and also started the tick of the timer at end of the constructor.. But the square still wont' move.. What am i doing wrong?

Below is the JPanel.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class A3JPanel extends JPanel implements KeyListener, ActionListener{
public static final int JFRAME_AREA_WIDTH = A3Constants.JFRAME_AREA_WIDTH;
public static final int JFRAME_AREA_HEIGHT = A3Constants.JFRAME_AREA_HEIGHT;;

public static final Rectangle HOME_AREA = A3Constants.HOME_AREA;
public static final Rectangle LEO_LEFT_AREA = A3Constants.LEO_LEFT_AREA;
public static final Rectangle ALL_WALLS_AREA = A3Constants.ALL_WALLS_AREA;
public static final Rectangle EXITING_SLIDES_AREA = A3Constants.EXITING_SLIDES_AREA;

public static final Color NICE_GRAY_COLOUR = A3Constants.NICE_GRAY_COLOUR;
public static final Color GAME_SCREEN_COLOUR = A3Constants.GAME_SCREEN_COLOUR;
public static final Color SLIDES_AREA_COLOUR = A3Constants.SLIDES_AREA_COLOUR;
public static final Color LEO_AREA_COLOUR = A3Constants.LEO_AREA_COLOUR; 
public static final Color HOME_AREA_COLOUR = A3Constants.HOME_AREA_COLOUR;
public static final Color WALL_COLOUR = A3Constants.WALL_COLOUR;

public static final int MAX_WALLS = A3Constants.MAX_WALLS;

public static final Font TINY_FONT = A3Constants.TINY_FONT;
public static final Font LARGE_FONT = A3Constants.LARGE_FONT;
public static final Font HUGE_FONT = A3Constants.HUGE_FONT;

public static final int LARGE_FONT_SIZE = A3Constants.LARGE_FONT_SIZE;
public static final int HUGE_FONT_SIZE = A3Constants.HUGE_FONT_SIZE;

public static final Point TICKS_POSITION = A3Constants.TICKS_POSITION;
public static final Point WINNER_LOSER_INFO_POSITION = A3Constants.WINNER_LOSER_INFO_POSITION;  
public static final Point INFORMATION_POSITION1 = A3Constants.INFORMATION_POSITION1;
public static final Point INFORMATION_POSITION2 = A3Constants.INFORMATION_POSITION2;
public static final Point INFORMATION_POSITION3 = A3Constants.INFORMATION_POSITION3;

public static final int TICKS_ALLOWED = A3Constants.TICKS_ALLOWED; 
public static final int UP = A3Constants.UP;
public static final int DOWN = A3Constants.DOWN;
public static final int LEFT = A3Constants.LEFT;
public static final int RIGHT = A3Constants.RIGHT;

private CoolCat coolCat;
private Timer t;

public A3JPanel() {
    setBackground(Color.GREEN);
    coolCat = new CoolCat(A3Constants.LEO_START_AREA.x, A3Constants.LEO_START_AREA.y);
    addKeyListener(this);
    t = new Timer(30,this);
    t.start();
    //t.addActionListener(this);

}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    drawGameArea(g);
    coolCat.draw(g);
}

private void drawGameArea(Graphics g){
    g.setColor(A3Constants.LEO_AREA_COLOUR);
    g.fillRect(A3Constants.LEO_LEFT_AREA.x, A3Constants.LEO_LEFT_AREA.y, A3Constants.LEO_LEFT_AREA.width, A3Constants.LEO_LEFT_AREA.height);
    g.setColor(A3Constants.WALL_COLOUR);
    g.fillRect(A3Constants.ALL_WALLS_AREA.x, A3Constants.ALL_WALLS_AREA.y, A3Constants.ALL_WALLS_AREA.width, A3Constants.ALL_WALLS_AREA.height);
    g.setColor(A3Constants.HOME_AREA_COLOUR);
    g.fillRect(A3Constants.HOME_AREA.x, A3Constants.HOME_AREA.y, A3Constants.HOME_AREA.width, A3Constants.HOME_AREA.height);

}

public void keyPressed(KeyEvent e){
    if(e.getKeyCode() == KeyEvent.VK_UP){
        coolCat.setDirection(A3Constants.UP);
    }
    if(e.getKeyCode() == KeyEvent.VK_DOWN){
        coolCat.setDirection(A3Constants.DOWN);
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT){
        coolCat.setDirection(A3Constants.LEFT);
    }
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
        coolCat.setDirection(A3Constants.RIGHT);
    }
}

public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}


public void actionPerformed(ActionEvent e){
    coolCat.move();
    repaint();
}

}

And below is the other Class.

import java.awt.*;

public class CoolCat {
public static final Rectangle LEO_START_AREA = A3Constants.LEO_START_AREA;

public static final int GAME_SCREEN_AREA_TOP = A3Constants.GAME_SCREEN_AREA_TOP;
public static final int GAME_SCREEN_AREA_BOTTOM = A3Constants.GAME_SCREEN_AREA_BOTTOM;
public static final int GAME_SCREEN_AREA_LEFT = A3Constants.GAME_SCREEN_AREA_LEFT;
public static final int GAME_SCREEN_AREA_RIGHT = A3Constants.GAME_SCREEN_AREA_RIGHT;

public static final int UP = A3Constants.UP;
public static final int DOWN = A3Constants.DOWN;
public static final int LEFT = A3Constants.LEFT;
public static final int RIGHT = A3Constants.RIGHT;

private Rectangle area;
private int speed;
private int direction;

public CoolCat(int x, int y){

    this.speed = speed;
    speed = (int)(Math.random() * (8 - 4 + 1)) + 4;
    area = new Rectangle(A3Constants.LEO_START_AREA.x, A3Constants.LEO_START_AREA.y);
    direction = RIGHT;

}

public Rectangle getArea(){
    area = new Rectangle(LEO_START_AREA.x, LEO_START_AREA.y, LEO_START_AREA.width, LEO_START_AREA.height);
    return area;

}

public void setDirection(int direction){
    this.direction = direction;
}

//public boolean hasReachedHome(Rectangle zhomeArea){}

public void move(){
    if(direction == A3Constants.UP){
        area.y -= speed;
    } else if(direction == A3Constants.DOWN){
        area.y += speed;
    } else if(direction == A3Constants.LEFT){
        area.x -= speed;
    } else if(direction == A3Constants.RIGHT){
        area.x += speed;
    }
}

public void draw(Graphics g){
    g.setColor(Color.RED);
    g.fillOval(A3Constants.LEO_START_AREA.x, A3Constants.LEO_START_AREA.y, A3Constants.LEO_START_AREA.width, A3Constants.LEO_START_AREA.height);
}

}

2 Answers2

1

You are adding a KeyListener to a JPanel, a component that by default cannot accept the focus, and the focus is required for key listeners to work.

A simple solution would be to allow your JPanel to accept focus and then request focus be given to it.

A better solution is to avoid use of KeyListeners for Swing applications and instead use Key Bindings (as has been discussed in similar questions many times previously). For example, please check out: How to make an image move while listening to a keypress in Java.

Community
  • 1
  • 1
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
0

Try something like this. I just made this quickly, so please excuse any errors.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class g{
    public static void main(String args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                create();
            }
        });
    }
    public static MyPanel my;
    public static void create(){
        JFrame f = new JFrame("test");
        my = new MyPanel();
        f.add(my);
        f.setSize(1000,1000);
        f.setVisible(true);
        f.addKeyListener(new KeyListener(){
            @Override
            public void keyPressed(KeyEvent e){
                if(e.getKeyCode == 37){ //left
                    my.move(4); //1 = up, 2 = right, 3 = down, 4 = left
                }
                if(e.getKeyCode == 39){ //left
                    my.move(2); //1 = up, 2 = right, 3 = down, 4 = left
                }
                if(e.getKeyCode == 38){ //left
                    my.move(1); //1 = up, 2 = right, 3 = down, 4 = left
                }
                if(e.getKeyCode == 40){ //left
                    my.move(3); //1 = up, 2 = right, 3 = down, 4 = left
                }
            }
            @Override
            public void keyReleased(KeyEvent e){
                //do nothings
            }
            @Override
            public void keyTyed(KeyEvent e){
                //do nothing
            }
        });
    }
}

public class MyPanel extends JPanel implements ActionListener{
    public static Timer time1;
    public Square s;
    public MyPanel(){
        time1 = new Timer(50, this);
        time1.start();
    }
    public void actionPerformed(ActionEvent e){
        repaint();
    }
    public void move(int d){
        if(d == 1){
            s.setY(s.getY()-1);
        }
        if(d == 2){
            s.setX(s.getX() + 1);
        }
        if(d == 3){
            s.setY(s.getY() + 1);
        }
        if(d == 4){
            s.setX(set.getX() - 1);
        }
        repaint();
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        s.paintSquare(g);
    }
}

public class Square{
    public int x;
    public int y;
    public void setX(int xPos){
        this.x = xPos;
    }
    public int getX(){
        return x;
    }
    public void setY(int yPos){
        this.y = yPos;
    }
    public int getY(){
        return y;
    }
    public void paintSquare(Graphics g){
        g.setColor(Color.WHITE);
        g.fillRect(0,0,1000,1000);
        g.setColor(Color.RED);
        g.fillRect(x,y,30,30);
    }
}
mkaminsky
  • 353
  • 2
  • 10