3

如果您可以这样做,那么 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,则必须为每个按钮创建单独的键绑定。我展示的例子不是更有效率吗?为什么不?

4

1 回答 1

2

如果您纯粹计算 CPU 周期,是的,它(可以说)效率更高(经过仔细考虑,我什至不确定)。但也有一些反对它的强项:

  1. 它使您的代码非常难看(想象一下您有数千个测试)
  2. 它的可重用性较低
  3. 更少面向对象:将对象 KeyStroke 绑定到对象 Action 更加 OO(请参阅此处的 Actions 更多信息)
  4. 它更容易出错,因为您的代码可读性较差并且可能变得巨大
  5. 您的代码是紧密耦合的(您几乎无法将 KeyListener 移动到单独的类中)
  6. 在您的测试中,您检查了哪个按钮触发了该事件,但您还不知道输入了哪个键。您将不得不添加更多测试来找出答案。

因此,对于非常局部化的问题,您的方法可能就足够了,而对于更大的视图,它就不能成立。

您可以在此处的第三段中找到有关此问题的一些类似和附加评论。

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

于 2012-05-15T22:26:43.200 回答