【发布时间】:2014-08-25 22:27:24
【问题描述】:
我正在尝试用 Java 制作游戏(乒乓球)。此刻,我还在纠结于独立移动球拍。
总结游戏,我有 2 个对象由同一个键盘控制。 Racket_1 应该在按下“a”时上升,在按下“q”时下降,Racket_2 应该在“p”和“m”时做同样的事情。当我尝试随机移动球拍时,在我看来 keyPressed 和 keyReleased 在某些情况下不会被触发(某种按键和释放键的顺序)。
这是我的示例代码(我通过打印按键来模拟动作):
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PingPong extends JFrame implements KeyListener {
private JPanel mainPanel = new JPanel();
private boolean isAPressed;
private boolean isQPressed;
private boolean isPPressed;
private boolean isMPressed;
public PingPong() {
this.setSize(400, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setContentPane(mainPanel);
this.setFocusable(true);
this.addKeyListener(this);
}
@Override
public void keyPressed(KeyEvent e) {
char key = e.getKeyChar();
switch (key) {
case 'a':
isAPressed = true;
break;
case 'q':
isQPressed = true;
break;
case 'p':
isPPressed = true;
break;
case 'm':
isMPressed = true;
break;
}
System.out.println("a is " + isAPressed + ", q is " + isQPressed
+ ", p is " + isPPressed + ", m is " + isMPressed);
}
@Override
public void keyReleased(KeyEvent e) {
char key = e.getKeyChar();
switch (key) {
case 'a':
isAPressed = false;
break;
case 'q':
isQPressed = false;
break;
case 'p':
isPPressed = false;
break;
case 'm':
isMPressed = false;
break;
}
System.out.println("a is " + isAPressed + ", q is " + isQPressed
+ ", p is " + isPPressed + ", m is " + isMPressed);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
public static void main(String[] args) {
new PingPong().setVisible(true);
}
}
如果需要多线程,请尽量简单,因为我是新手。
【问题讨论】:
-
如果你在这个网站上搜索过类似类型的问题,你会经常看到 Swing 专家建议不要使用 KeyListeners,而是使用 Key Bindings,我同意他们的理由有很多。我建议您这样做,搜索类似的问题,因为您可能会找到对您有帮助的答案。
标签: java multithreading swing keyevent