关键事件不起作用

时间:2014-06-20 18:11:30

标签: java swing events awt key-events

我正在练习事件并想要设置它所以我有一个响应按钮和按键的类,它编译得很好,但关键事件不是调用方法/工作。

这是班级:

class CircleListener extends KeyAdapter implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == nlrg_button) canvas.enlarge();
            else if (e.getSource() == shrink_button) canvas.shrink();
            else if (e.getSource() == superenlarger_button) canvas.enlargeAlot();
            else if (e.getSource() == supershrinker_button) canvas.shrinkAlot();

            repaint();
        }
        @Override
        public void keyPressed(KeyEvent e) {
            switch(e.getKeyCode()){
                case KeyEvent.VK_DOWN: canvas.circleDown(); break;
                case KeyEvent.VK_UP: canvas.circleUp(); break;
                case KeyEvent.VK_LEFT: canvas.circleLeft(); break;
                case KeyEvent.VK_RIGHT: canvas.circleRight(); break;
            }
            repaint();
        }
    }

这是实例化+注册:

CircleListener listener = new CircleListener();

        // Bind buttons with respective eventlistener class
        nlrg_button.addActionListener(listener);
        shrink_button.addActionListener(listener);
        superenlarger_button.addActionListener(listener);
        supershrinker_button.addActionListener(listener);
            // Bind canvas to keylistener class
        canvas.addKeyListener(listener);

他们试图调用的方法存在并按预期工作,我在确认之前通过按钮调用它们来保证。

为什么它不起作用/我错过了什么? &安培;是否有更有效的形式?

1 个答案:

答案 0 :(得分:4)

  

为什么它不起作用/我缺少什么?

仅将KeyEvents分派给具有焦点的组件。由于面板上有许多组件,因此面板永远不会有焦点。你不应该为此使用KeyEvents。

  

我有一个响应按钮和按键的课程

这是一个很好的设计,但是你不应该为此使用KeyEvents。相反,您应该使用Key Bindings

使用Key Bindings时,您可以在按钮和KeyStroke之间共享Action。阅读How to Use Key Bindings上Swing教程中的部分,了解更多信息和示例。

使用Actions构建应用程序是一个很好的设计。本教程还有一个关于How to Use Action的部分,您应该看一下。所有Swing组件都使用Actions和Key Bindings。您可以查看Key Bindings以获取Swing组件的默认绑定,以及使用键绑定的一些示例代码。