这是我的问题。当我尝试处理KB事件时,我的程序什么都不做。有些人认为这是因为忙碌的等待(与主线程争斗的新线程)。我该如何解决?
public class GameCanvas extends Canvas {
int myX = 250;
int myY = 0;
int speedValue = 15;
int bottom = 480;
GameCanvas() {
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.VK_LEFT:
if (myX > 5) myX -= 5;
break;
case KeyEvent.VK_RIGHT:
if (myX < 480) myX += 5;
break;
}
repaint();
}
});
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
setGameSpeed(speedValue);
if (myY < bottom) {
myY += 5;
} else {
bottom -= 20;
myY = 0;
}
repaint();
}
}
}).start();
}
public void setGameSpeed(int value) {
try {
sleep(value);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void paint(Graphics g) {
g.setColor(Color.darkGray);
g.fillRect(myX, myY - 5, 25, 25);
buildGameBottom(g);
}
void buildGameBottom(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0, bottom + 20, 500, bottom + 20);
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame();
GameCanvas gameCanvas = new GameCanvas();
gameCanvas.setSize(new Dimension(500, 500));
gameCanvas.setBackground(Color.LIGHT_GRAY);
gameCanvas.requestFocus();
frame.add(gameCanvas);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
}
答案 0 :(得分:2)
这里的问题不是忙着等待(你这里没有忙着等待)。
唯一的问题是KeyListener
已连接到Canvas
,但Frame
具有输入焦点。尝试点击Canvas
即可。
此外,如果您正在使用重绘循环,则无需在KeyListener
中调用重绘。
并且,请使用SwingUtilities.invokeLater
从不同的线程调用Swing / AWT函数。
在将框架设置为可见之后移动requestFocus
调用可以解决您的问题(因为您无法提供尚未显示的焦点)。