如果您可以这样做,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,则必须为每个按钮创建一个单独的键绑定(bind)。我展示的例子不是更有效率吗?为什么不呢?
最佳答案
如果您纯粹计算 CPU 周期,是的,它(可以说)效率更高(经过仔细考虑,我什至不确定)。但也有一些反对意见:
- 它使您的代码变得非常丑陋(假设您有数千个测试)
- 可重用性较差
- 不太面向对象:将对象 KeyStroke 绑定(bind)到对象 Action 更面向对象(请参阅有关 Actions 的更多信息 here)
- 它更容易出错,因为您的代码可读性较差并且可能变得庞大
- 您的代码是紧耦合的(您几乎不能将 KeyListener 移到单独的类中)
- 在您的测试中,您检查哪个按钮触发了事件,但您还不知道键入了哪个键。您将必须添加更多测试才能找出答案。
所以对于非常局部的问题,你的方法就足够了,而对于更大的观点,它就站不住脚了。
可以在第三段找到here ,关于此事的一些类似的和额外的评论。
最后,把一个KeyListener放在一个JButton上有点奇怪。通常,我们会注册一个 ActionListener。
关于java - KeyBindings 和 KeyListeners 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609388/