Java KeyListener 与键绑定(bind)

标签 java swing actionlistener keylistener key-bindings

我正在尝试编写一个计算器并遇到问题。我已经为所有按钮制作了一个 Action 监听器,现在我想让从键盘输入数据成为可能。我是否需要为 KeyListener 或 Keybinding 完成所有操作,或者是否有其他方法可以在单击按钮后将其发送到 actionlistener 中的说明?哪个更好:按键监听器或按键绑定(bind)

最佳答案

一般来说,如果您的按键输入集有限,则按键绑定(bind)是更好的选择。

KeyListener 存在与可聚焦性相关的问题,并且对于 GUI 中的其他控件,焦点将始终从组件(使用 KeyListener)上移开。

一个简单的解决方案是使用 Actions API 。这允许您定义一个自包含的“操作”,它充当 ActionListener,但也携带可用于配置其他 UI 组件(特别是按钮)的配置信息

例如...

采用一个通用的 NumberAction ,它可以代表任何数字(现在将其限制为 0-9)...

public class NumberAction extends AbstractAction {

    private int number;

    public NumberAction(int number) {
        putValue(NAME, String.valueOf(number));
    }

    public int getNumber() {
        return number;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        int value = getNumber();
        // Do something with the number...
    }

}

你可以做类似的事情......

// Create the action...
NumberAction number1Action = new NumberAction(1);
// Create the button for number 1...
JButton number1Button = new JButton(number1Action);

InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
// Create a key mapping for number 1...
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "number1");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), "number1");

ActionMap am = getActionMap();
// Make the input key to the action...
am.put("number1", number1Action);

你就完成了......

您还可以为同一个号码创建任意数量的 NumberAction 实例,这意味着您可以单独配置 UI 和绑定(bind),但要知道,当触发时,它们将执行相同的代码逻辑,例如...

关于Java KeyListener 与键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486827/

相关文章:

java - 使用 iText 在 Java 中将多个表转为 PDF 报告

java - 如何在 Java Swing 中创建二维 SplitPane

java - 向程序添加验证 - JAVA

java - 如何在 Java 中使用 JFileChooser 保存文件?

java - 根据组合框选择更新文本框

java - 有没有办法可以停止程序并等待用户单击按钮

java - 库 (Cognalys) 类未找到异常

java - JPA query.getResultList() 返回错误的对象?

java - 慢速 Swing GUI 启动时间

Java - 使用单独的 ActionListener 更改 JTextField