1

我是 Java 新手,所以请原谅我寻求帮助,但是在寻找解决方案 4 小时后,我真的很绝望。

我目前正在设置游戏并希望实现关键控制。我试图通过这样做KeyListenerKeyEventDispatcher但我无法让它工作。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 新手。

4

1 回答 1

1

您面临的第一个问题KeyListener是众所周知且有据可查(尤其是在 SO 上)。KeyListener只有当它们附加到的组件是可聚焦的并且具有键盘焦点时才会响应。想想一个文本字段,当它没有焦点时,它不会更新。

您的第二个问题是使用KeyBoardFocusManager,这对于这个问题来说简直是矫枉过正。

相反,您应该使用 [Key Bindings] API,这样可以更简单地监控KeyBoardFocusManager和更健壮KeyListeners

于 2013-05-13T21:43:32.703 回答