KeyBindings和KeyListeners之间的区别

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

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

  1. 它会使你的代码变得非常丑陋(想象你有成千上万的测试)
  2. 它不太可重复使用
  3. 更少面向对象:将对象KeyStroke绑定到对象Action更为OO(有关此处的 Actions,请参阅更多信息 )
  4. 它更容易出错,因为你的代码可读性较差,而且可能变得巨大
  5. 你的代码是紧密耦合的(你很难在一个单独的类中移动你的KeyListener)
  6. 在测试中,您检查哪个按钮触发了事件,但您还不知道键入了哪个键。 您必须添加更多测试才能找到答案。

因此,对于非常本地化的问题,您的方法就足够了,而对于更大的视图,它无法保持。

你可以在这里的第三段找到关于这个问题的一些类似的和额外的评论。

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