java - KeyBindings 和 KeyListeners 之间的区别

标签 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,则必须为每个按钮创建一个单独的键绑定(bind)。我展示的例子不是更有效率吗?为什么不呢?

最佳答案

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

  1. 它使您的代码变得非常丑陋(假设您有数千个测试)
  2. 可重用性较差
  3. 不太面向对象:将对象 KeyStroke 绑定(bind)到对象 Action 更面向对象(请参阅有关 Actions 的更多信息 here)
  4. 它更容易出错,因为您的代码可读性较差并且可能变得庞大
  5. 您的代码是紧耦合的(您几乎不能将 KeyListener 移到单独的类中)
  6. 在您的测试中,您检查哪个按钮触发了事件,但您还不知道键入了哪个键。您将必须添加更多测试才能找出答案。

所以对于非常局部的问题,你的方法就足够了,而对于更大的观点,它就站不住脚了。

可以在第三段找到here ,关于此事的一些类似的和额外的评论。

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

关于java - KeyBindings 和 KeyListeners 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609388/

相关文章:

java - 下载到内存后如何访问文件,Firebase?

Java KeyListener 没有检测到键盘输入

java - 如何使用 Jackson 将 Color java 类解析为 JSON?

java - 如何使用 KeyListener 仅在按下按键时捕获

Java Buffer策略学习

java - 没有收到 Java 中短信网关发送的短信?

java - Maven 发布 :prepare namespace prefix "xsi" collides with an additional namespace declared by the element

java - JavaFX 中迭代器仅获取第一个元素

java - 使用 DefaultListCellRenderer 设置 JList 图标?

Java输入中文