KeyBindings和KeyListeners之间的区别

时间:2012-05-15 21:56:15

标签: java swing awt key-bindings keylistener

如果您可以这样做,KeyBindings有什么意义:

// Imports

public void Test {
    JButton button1;
    JButton button2;
    JButton button3;
    ...

    Test() {
        button1 = new JButton();
        button1.addKeyListener(this);

        button2 = new JButton();
        button2.addKeyListener(this);

        button3 = new JButton();
        button3.addKeyListener(this);

        ...
    }

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    public void keyTyped(KeyEvent e) {

        Object src = e.getSource();

        if (src == button1) {
            ...
        }

        else if (src == button2) {
            ...
        }

        else if (src == button3) {
            ...
        }
        ...
    }
}

假设我有十个按钮。然后,如果使用KeyBindings,则必须为每个按钮单独进行键绑定。不是我展示的更高效的例子吗?为什么不呢?

1 个答案:

答案 0 :(得分:2)

如果你纯粹计算CPU周期,是的(可以说)更有效率(经过仔细考虑,我甚至不确定)。但是有一些强烈的反对意见:

  1. 它使你的代码非常难看(想象你有成千上万的测试)
  2. 它不太可重复使用
  3. 较少面向对象:将对象KeyStroke绑定到对象Action更为OO(有关Actions here的详细信息,请参阅
  4. 它更容易出错,因为你的代码可读性较差,而且可能会变得很大。
  5. 您的代码紧密耦合(您几乎无法在单独的类中移动KeyListener)
  6. 在测试中,您检查哪个按钮触发了事件,但您还不知道键入了哪个键。您将不得不添加更多测试以找到它。
  7. 因此,对于非常本地化的问题,您的方法就足够了,而对于更大的视图,它无法保持。

    您可以在第三段here中找到关于此事的一些类似和补充意见。

    最后,将KeyListener放在JButton上有点奇怪。通常,我们注册一个ActionListener。