KeyListener不会集中注意力

时间:2013-05-13 20:38:41

标签: java swing focus keylistener

我是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的新手。

1 个答案:

答案 0 :(得分:1)

您在KeyListener面临的第一个问题是众所周知且记录良好(特别是在SO上)。 KeyListener只会在他们所附加的组件具有可调焦性且具有键盘焦点时才会响应。想想一个文本字段,当它没有焦点时,它就不会更新。

你的第二个问题是使用KeyBoardFocusManager,这对这个问题来说太过分了。

相反,您应该使用[Key Bindings] API,这更加简单,必须监控KeyBoardFocusManager并且更加健壮,然后KeyListeners