JLabel的KeyListener对我不起作用

当我按下向上或向下箭头时,我的代码出现问题。 这是我的代码,对不起我的英语。 这是Racket 1的一部分,Racket 2 id的部分类似。

//--->Racket 1 : Racket1.addKeyListener(this); Racket1.setBounds(50, 200, 16, 100); //<----- setBounds (Placer position du JLabel x,y + taille de la plateforme x,y) Racket1.setBackground(Color.white); Racket1.setOpaque(true); Racket1.setFocusable(true); //<----- Permet d'utiliser KeyListener Pour un JLabel Racket1.requestFocus(); 

这是keyListener的一部分:

  public void keyTyped (KeyEvent e) { } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_UP) { Racket1.setLocation(Racket1.getX(), Racket1.getY() +20); } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { Racket1.setLocation(Racket1.getX(), Racket1.getY() -20); } else if (e.getKeyCode() == 'z') { Racket2.setLocation(Racket2.getX(), Racket2.getY() +20); } else if (e.getKeyCode() == 's') { Racket2.setLocation(Racket2.getX(), Racket2.getY() -20); } } public void keyReleased(KeyEvent e) { 

不要使用KeyListener。 一次只能有一个组件具有焦点,因此您只能移动其中一个球拍。

相反,你应该使用KeyBindingsKey Bindings用于将Action绑定到KeyStroke ,组件不需要具有焦点。

有关详细信息,请参阅使用键盘进行运动 。 KeyboardAnimation.java甚至有一个使用两个标签的示例。

您的问题可能是JLabel不是焦点所有者。 默认情况下,JLabel不可聚焦。 你需要打电话

 yourLabel.setFocusable(true); yourLabel.requestFocus(); 

然后它应该工作。