У меня есть редактируемый JavaFX ComboBox. пользователь должен только быть в состоянииКак использовать JavaFX KeyListeners?
- алфавитов типа («а» до «Z»), пространства и круглые скобки («(», «)»), чтобы ввести строку,
- нажмите вкладку, чтобы выйти
- нажмите клавишу ВВОД, чтобы выйти из
Как отфильтровать любой другой ключ, модификаторы и т.д.?
Я прочитал и использовал обработчики событий, такие как Key_Pressed, Key_Released, но я не могу найти прямой способ достичь вышеуказанного. Я использую Mac OS Yosemite, Java 8, последняя версия JavaFX и
public static final EventType<KeyEvent> KEY_TYPED
просто не работает вообще. Ниже приведена моя попытка. Переменная typedText сохраняет требуемые значения.
comboBox.addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
private final String[] allowedItems = new String[]{"a","b","c","d","e","f",
"g","h","i","j","k","l","m","n","o","p","q","r",
"s","t","u","v","w","x","y","z"," ","(",")"};
private final List data = Arrays.asList(allowedItems);
private String tempInput;
public boolean containsCaseInsensitive(String s, List<String> l){
for (String string : l) {
if (string.equalsIgnoreCase(s)){
return true;
}
}
return false;
}
public void handle(KeyEvent event) {
boolean b;
b = event.isShiftDown();
if (b) {
if (event.getText().equals("(")) {
tempInput = "(";
} else if (event.getText().equals(")")){
tempInput = ")";
}
} else {
tempInput = event.getCode().toString().toLowerCase();
}
System.out.println("tempInput:"+tempInput);
if (containsCaseInsensitive(tempInput, data)) {
typedText = tempInput;
System.out.println("typedText:"+typedText);
}
}
});
}
Просьба поделиться тем, что вы достигли. – async
Цикл событий JavaFX является двунаправленным, то есть сообщения о событиях отправляются из системы и просачиваются вниз до вашего контроля ... и затем перколяются обратно из вашего управления обратно в систему. Две абстракции FX для обработки событий - это «фильтры» и «обработчики». Фильтр ловит сообщение на своем пути к элементу управления, и обработчик улавливает сообщение на своем пути назад. В вашем случае вы можете использовать фильтр. В противном случае событие будет обработано элементом управления до его обработки обработчиком. – scottb
Кроме того, ваш сегмент кода не содержит вызовов 'потреблять()'. Если вы не потребляете сообщение о событии в своем фильтре, оно будет продолжать передаваться элементу управления. Если вы хотите определить пользовательские поведения, отличные от поведения элемента управления по умолчанию, вам нужно будет использовать событие, чтобы элемент управления не обрабатывал событие. – scottb