Search code examples
javakeylistenerkeyevent

Move a rectangle using arrow keys


I am trying to develop a simple game where you can move a rectangle using the left and right arrow keys and to shoot using the spacebar.

I have added a KeyListener and others, but when I run it I have nothing as the output of key pressed or others.

I have two classes:

PaintDemo class:

package game;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintDemo {

    public static void main(String[] args) {

        JFrame mainFrame = new JFrame("Game 1.1");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setBounds(10, 10, 400, 400);
        mainFrame.setLayout(new BorderLayout());

        JPanel mainPanel = new JPanel();
        mainPanel.setBackground(Color.WHITE);

        PaintComponent paintPanel = new PaintComponent();

        mainFrame.add(mainPanel, BorderLayout.PAGE_START);
        mainFrame.add(paintPanel, BorderLayout.CENTER);

        mainFrame.setVisible(true);

    }
}

PaintComponent class:

package game;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JPanel;


public class PaintComponent extends JPanel implements KeyListener {
    int dx = 200;
    int dy = 300;
    int my = 300;
    public Rectangle2D rec = new Rectangle2D.Double(dx , dy, 30, 10);

    public PaintComponent() {
        this.addKeyListener(this);
        this.setBackground(Color.white);
    }

    public void shoot(KeyEvent evt){
        if (evt.getKeyCode() == KeyEvent.VK_SPACE){
        my -= 7;
        repaint();
        }
    }

    public void moveRec(KeyEvent evt){
        switch(evt.getKeyCode()){
            case KeyEvent.VK_LEFT:
                System.out.println("test");
                dx -= 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
            case KeyEvent.VK_RIGHT:
                dx += 2;
                rec.setRect(dx, dy, 30, 10);
                repaint();
        }
    }

    @Override
    protected void paintComponent(Graphics grphcs){
        super.paintComponent(grphcs);
        Graphics2D gr = (Graphics2D) grphcs;
        gr.draw(rec);
    }


    @Override
    public void keyTyped(KeyEvent e) {
        System.out.println("2");
        shoot(e);
    }


    @Override
    public void keyPressed(KeyEvent e) {
        moveRec(e);

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}

The shooting method is not complete.


Solution

  • Change repaint() to paintComponent here and add Graphics g = getGraphics();

    public void moveRec(KeyEvent evt){
        switch(evt.getKeyCode()){
            case KeyEvent.VK_LEFT:
                System.out.println("test");
                dx -= 2;
                rec.setRect(dx, dy, 30, 10);
                Graphics g = getGraphics();
                paintComponent(g);
                break;
            case KeyEvent.VK_RIGHT:
                dx += 2;
                rec.setRect(dx, dy, 30, 10);
                Graphics g = getGraphics();
                paintComponent(g);
                break;
        }
    }    
    

    Let me know if this works :)



    EDIT:
    Add this line

    this.setFocusable(true);
    

    to PaintComponent constructor, it will make keypresses go through.