我正在尝试编写一个计算器并遇到问题。我已经为所有按钮制作了一个 Action 监听器,现在我想让从键盘输入数据成为可能。我是否需要为 KeyListener 或 Keybinding 完成所有操作,或者是否有其他方法可以在单击按钮后将其发送到 actionlistener 中的说明?哪个更好:按键监听器或按键绑定(bind)
最佳答案
一般来说,如果您的按键输入集有限,则按键绑定(bind)是更好的选择。
KeyListener
存在与可聚焦性相关的问题,并且对于 GUI 中的其他控件,焦点将始终从组件(使用 KeyListener
)上移开。
一个简单的解决方案是使用 Action
s 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/