【发布时间】:2018-12-15 18:16:07
【问题描述】:
在我的 MainWindow 类(一个 JFrame)中,我使用“+”和“-”键作为热键来向上或向下修改名为 degreeField 的某个 JTextField 的值。我将具有以下 dispatchKeyEventMethod 的 KeyEventDispatcher 添加到我的 KeyboardFocusManger:
@Override
public boolean dispatchKeyEvent(KeyEvent evt) {
if(simPanel.main.isFocused()){
int type = evt.getID();
if(type == KeyEvent.KEY_PRESSED){
int keyCode = evt.getKeyCode();
switch(keyCode){
// other cases
case KeyEvent.VK_PLUS:
// increase degreeField by 1, if double
// otherwise set it to "270.0"
return true;
case KeyEvent.VK_MINUS:
// decrease degreeField by 1, if double
// otherwise set it to "270.0"
return true;
default:
return false;
}
}
else if(type == KeyEvent.KEY_RELEASED){
// irrelevant
return false;
}
}
return false;
}
KeyEventDispatcher 正常工作,并且 degreeField 的文本按预期进行了修改。但是,当我关注另一个 JTextField 时,“+”或“-”也会输入到该字段中。
自从我返回 true 后,我的印象是该事件不应再由我关注的 JTextField 分派。使用 NetBeans 调试器,我在相关案例中放置了一个断点,并检查了焦点文本字段的文本。当时,没有 + 附加。因此,+ 在我完成调度此事件并返回 true 后附加。
任何人有任何想法,我如何才能真正防止事件被进一步传递?
我知道我可以在文本字段上放置一个额外的侦听器以防止输入“+”和“-”字符,但我更喜欢一个也适用于非字符键的解决方案。 (我在使用向上和向下箭头键时遇到了类似的问题;它不会破坏任何东西,只是在我的文本字段中烦人地循环)。
感谢 MadProgrammer:
InputMap im = senderXField.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap am = senderXField.getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, 0), "Pressed.+");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Pressed.up");
am.put("Pressed.+", angleUpAction); // works fine
很遗憾
am.put("Pressed.up", indexUpAction); // does not trigger
这适用于所有箭头键。他们做他们通常的事情(分别移动光标或焦点)并且不触发动作。如果我使用 WHEN_FOCUSED InputMap,它们会按预期工作,这让我相信它们的默认行为是作为可以覆盖的 WHEN_FOCUSED 级别的 KeyBinding 实现的。
虽然从技术上讲,作为一种解决方法,我可以为我的 MainWindow 中的所有文本字段实现箭头键命令,但这会......很奇怪。我希望有一个更好的解决方案,让我保留整个窗口的命令,但也覆盖它们的默认行为。
解决了
【问题讨论】:
-
" 热键用于向上或向下修改名为 degreeField 的某个 JTextField 的值。" 您正在描述
JSpinner..