如何从其他班级获得Keyevent?

时间:2016-02-11 09:59:02

标签: java keyevent

所以我得到了两个名为Viewer和PaintWindow的类。在我的例子中,Viewer类充当控制器,而我使用我的PaintWindow类在JPanel上绘制东西。

现在我正在尝试组建一个小游戏,但我不了解如何实现KeyListener以便能够控制游戏。我想要的是一个监听器,它正在监听一个keyEvent,所以我可以决定会发生什么。这就是我的代码的样子:

浏览器:

public void run() {
    System.out.println("Viewer Run");
    cloud1 = new ImageIcon("src/images/cloud.png");
    cloud2 = new ImageIcon("src/images/cloud.png");
    background1 = new ImageIcon("src/images/background.png");
    playerStill = new ImageIcon("src/images/still.png");
    playerRight = new ImageIcon("src/images/right.png");
    playerLeft = new ImageIcon("src/images/left.png");


    paintWindow = new PaintWindow(background1); 
    paintWindow.showImage(playerStill, 30, 370);
    paintWindow.addKeyListener(new KeyTimerListener());
    paintWindow.startAlarm();



}
/*
 * Lyssnar på vad som händer när man trycker en viss knapp
 */
private class KeyTimerListener implements KeyListener {

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == 37){
             System.out.print("Left");
         }
        else if (keyCode == 39){
             System.out.print("Right");
        }
        else if (keyCode == 32 ){
             System.out.print("JUMP");
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
}

}

这是我的PaintWindow类的一部分:

    public void addKeyListener(KeyListener listener){
    this.listener.add(listener);
}
private class AT extends Thread {
    KeyEvent keyevent;
    public void run() {
        try {
            Thread.sleep(1);
        }catch(InterruptedException e) {

        }
        for(KeyListener al : listener) {
            al.keyPressed(keyevent);//<-----------------------------
            }
        thread = null;
    }
}


public void startAlarm() {
    if(thread==null) {
        thread = new AT();
        thread.start();
    }
}

我得到一个nullpointer异常,因为我的KeyEvent为null。当然我可以将它定义为一个特定的键,但这对我来说并没有真正的帮助。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

忘记了KeyListener,因为PaintWindow不会收到任何关键事件,而不是java.awt.Component

相反,请在run()方法中添加此代码:

KeyboardFocusManager.getCurrentKeyboardFocusManager()
                .addKeyEventDispatcher(new KeyEventDispatcher() {
                    @Override
                    public boolean dispatchKeyEvent(final KeyEvent e) {

                        // we only want PRESSED events  
                        if(e.getID() == KeyEvent.KEY_PRESSED){


                            int keyCode = e.getKeyCode();
                            if(keyCode == 37){
                                 System.out.print("Left");
                             }
                            else if (keyCode == 39){
                                 System.out.print("Right");
                            }
                            else if (keyCode == 32 ){
                                 System.out.print("JUMP");
                            }
                        }
                        return false;
                    }
                });

这将收听您应用程序中的所有关键事件。

本主题中的更多信息:

How can I listen for key presses (within Java Swing) across all components?

答案 1 :(得分:0)

我认为你的问题是你没有传递任何关键的监听器。尝试实例化KeyTimerListener并添加它。 public void addKeyListener(new KeyTimerListener ()){ this.listener.add(listener);