【发布时间】:2016-05-23 19:48:13
【问题描述】:
我正在尝试编写一个代码来创建一个我称之为 gun 的东西,我希望能够将它向右或向左移动。我实现了KeyListener 和ActionListener 方法,但actionPerformed 不起作用。但是,keyPressed 方法确实有效。有什么我错过的想法吗?
public class Gun extends JPanel implements KeyListener, ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final int GUN_WIDTH = 100;
private static final int GUN_HEIGHT = 30;
private static final int GUN_UPPER_HEIGHT = 20;
private static final int GUN_UPPER_WIDTH = GUN_WIDTH / 4;
int x, y;
int velX;
public Gun() {
x = 250 - GUN_WIDTH / 2;
y = 500 - GUN_HEIGHT;
velX = 0;
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
int upperX = x + GUN_WIDTH / 2 - GUN_UPPER_WIDTH / 2;
int upperY = y - GUN_UPPER_HEIGHT;
g2d.setColor(Color.BLACK);
g2d.fillRect(x, y, GUN_WIDTH, GUN_HEIGHT);
g2d.fillRect(upperX, upperY, GUN_UPPER_WIDTH, GUN_UPPER_HEIGHT);
}
public void left() {
velX = -1;
}
public void right() {
velX = 1;
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
left();
System.out.println("LEFT");
}
if (key == KeyEvent.VK_RIGHT) {
right();
System.out.println("RIGHT");
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
@Override
public void actionPerformed(ActionEvent e) {
x += velX;
repaint();
}
public static void main(String[] args) {
Gun gun = new Gun();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Game");
frame.setLayout(new FlowLayout());
gun.setPreferredSize(new Dimension(500, 500));
frame.add(gun);
frame.setVisible(true);
frame.pack();
}
}
【问题讨论】:
-
我看到你使用了
addKeyListener(this),但你在某处对addActionListener也这样做了吗? -
考虑使用
Key Bindings而不是KeyListener。 -
@Zircon 我知道这是有问题的。然而,这里又出现了另一个问题。当我尝试将 'addActionListener(this)' 放入构造函数时,我不能,因为 Eclipse 不允许我这样做,它的行为就像这个方法甚至不存在一样。任何想法为什么?
标签: java swing actionlistener