【问题标题】:How do I get a Keyevent from another class?如何从另一个班级获得 Keyevent?
【发布时间】:2023-03-14 19:41:02
【问题描述】:

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

现在我正在尝试制作一个小游戏,但我不明白如何实现 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();
    }
}

由于我的 KeyEvent 为空,我得到一个空指针异常。当然我可以将它定义为一个特定的键,但这对我没有帮助。

我错过了什么?

【问题讨论】:

  • PaintWindow 是什么组件
  • @Berger 你是什么意思? PaintWindow 只是一个创建框架和 JPanel 并在 Graphics 对象的帮助下在其上绘制的类。
  • 自定义对象不接收任何关键事件,java.awt.Component 接收,或者您可以注册一个全局监听器,请参阅:stackoverflow.com/questions/5344823/…

标签: java keyevent


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    忘记你的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?

    【讨论】:

    • 成功了,谢谢。这是应该使用的常见做法吗?我以前使用过很多 ActionListener,最近学习了如何使用回调和观察者,但是如果组件本身不是 java.awt.Component,那么当我想要 keyPressed 时,这些方法就不能使用了。我假设 JPanel 就是这样一个组件,那么为什么在我有扩展 JPanel 的类之前它对我有用?
    • 是的 JPanel 是一个组件,所以在这种情况下没有问题。如果您的对象无法接收事件,则必须使用 KeyboardFocusManager 在更高级别进行侦听,它负责管理活动和聚焦的窗口,以及所有组件的焦点和事件调度。老实说,当无法使用 KeyListener 时,我不知道是否有比这更常见的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多