В моем классе MainWindow (JFrame) я использую клавиши «+» и «-» в качестве горячих клавиш для изменения значения определенного JTextField, называемого градусным полем вверх или вниз.Я добавляю KeyEventDispatcher со следующим dispatchKeyEventMethod в мой 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 работает, и текст СтепениField изменяется, как и ожидалось.Однако, когда у меня есть другой фокус 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, которое может быть перезаписано.
Хотя, технически, в качестве обходного пути, я мог быреализовать команды клавиш со стрелками для всех текстовых полей в моем MainWindow, это было бы ... странно.Я надеюсь, что есть лучшее решение, которое позволит мне сохранить команду для всего окна, а также перезаписать их поведение по умолчанию.
Решено