我是Java的新手,请原谅我寻求帮助,但经过4个小时的寻找解决方案,我真的很绝望。
我目前正在设置游戏并希望实施关键控件。我尝试通过KeyListener
和KeyEventDispatcher
执行此操作,但我无法让它发挥作用。
KeyListener
只是不会做出反应。我认为应该使用它的方法是重点。
以下是代码:
public class Sins extends JFrame implements KeyEventDispatcher {
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED ) {
if(KeyEvent.VK_UP == e.getID()){
System.exit(0);
}
} else if (e.getID() == KeyEvent.KEY_RELEASED) {
if(KeyEvent.VK_UP == e.getID()){
System.exit(0);
}
} else if (e.getID() == KeyEvent.KEY_TYPED) {
if(KeyEvent.VK_UP == e.getID()){
System.exit(0);
}
}
return false;
}
以下是应该在以下位置工作的方法:
public void run() {
setFocusable(true);
backgroundGraphics = (Graphics2D) background.getGraphics();
long fpsWait = (long) (1.0 / 30 * 1000);
requestFocusInWindow();
main: while (isRunning==true) {
long renderStart = System.nanoTime();
KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
manager.addKeyEventDispatcher(this);
x++;
requestFocusInWindow();
// Update Graphics
do {
Graphics2D bg = getBuffer();
if (isRunning == false) {
break main;
}
renderGame(backgroundGraphics); // this calls your draw method
if (scale != 1) {
bg.drawImage(background, 0, 0, width * scale, height
* scale, 0, 0, width, height, null);
} else {
bg.drawImage(background, 0, 0, null);
}
bg.dispose();
requestFocusInWindow();
this.requestFocus();
if(x ==5000){
isRunning=false;
}
} while (!updateScreen());
// Better do some FPS limiting here
long renderTime = (System.nanoTime() - renderStart) / 10000;
try {
Thread.sleep(Math.max(0, fpsWait - renderTime));
} catch (InterruptedException e) {
Thread.interrupted();
break;
}
renderTime = (System.nanoTime() - renderStart) / 10000;
}
this.dispose();
System.exit(0);
}
该程序目前在计数达到5000后自行关闭。出于测试目的,我试图通过向上按钮关闭它,但它不会以这种方式关闭。 我真的很感激一些帮助,因为我说我是Java的新手。
答案 0 :(得分:1)
您在KeyListener
面临的第一个问题是众所周知且记录良好(特别是在SO上)。 KeyListener
只会在他们所附加的组件具有可调焦性且具有键盘焦点时才会响应。想想一个文本字段,当它没有焦点时,它就不会更新。
你的第二个问题是使用KeyBoardFocusManager
,这对这个问题来说太过分了。
相反,您应该使用[Key Bindings] API,这更加简单,必须监控KeyBoardFocusManager
并且更加健壮,然后KeyListeners