使用KeyListener使用箭头键在JPanel中移动矩形

时间:2013-06-22 01:21:56

标签: java swing jpanel awt keylistener

我一直试图用箭头键进行JPanel移动。它没有奏效。我相信这是我的内心阶级延伸KeyAdapter。我也不确定ActionListener实施的是什么。我所做的另一课并不重要,因为它只是框架。

package jerryWorlds;

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

public class Jerry extends JPanel implements ActionListener{

int SizeX, SizeY, PosX, PosY, VelX, VelY;
Image img;
Timer time = new Timer(1, this);

public Jerry(){
    ImageIcon i = new ImageIcon();
    addKeyListener(new AL());
    time.start();
    img = i.getImage();
    PosX = 375;
    PosY = 250;
}

public void paint(Graphics g){
    Graphics2D g2d = (Graphics2D)g;
    g2d.fillRect(PosX, PosY, 50, 100);
}
public void actionPerformed(ActionEvent e) {
    PosX = PosX + VelX;
    repaint();
}

private class AL extends KeyAdapter{
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        System.out.println("YAY!");
        if(key == KeyEvent.VK_LEFT)
            VelX = -1;
        else if(key == KeyEvent.VK_RIGHT)
            VelX = 1;
    }

    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_LEFT)
            VelX = 0;
        else if(key == KeyEvent.VK_RIGHT)
            VelX = 0;
    }
}

}

1 个答案:

答案 0 :(得分:5)

  • 您需要在此网站中搜索类似的问题,因为它们通常具有相同的问题和相同的答案。
  • 他们会告诉你焦点是一个问题,因为除非它有焦点,否则组件的KeyListener将无法工作。
  • 他们会告诉你,不管你不应该使用KeyListener,而是使用Key Bindings。
  • 除非您确定要覆盖组件边框和子项的绘制(您没有),否则它们会告诉您不要覆盖paint(...)而是覆盖paintComponent(...)
  • 他们会告诉你一定要在paintComponent(...)
  • 中调用super方法

另请查看此animation and key bindings example