Обработка нажатия клавиши ВВОД в JavaFX 8 DataPicker
Я реализую ENTER как TAB в моем приложении JavaFX, как реквизит пользователей. Я использую следующий код, чтобы определить все элементы управления, которые существуют в панели, и добавить обработчик OnKeyPressed:
protected EventHandler<KeyEvent> processadorEnterEmCampo = new EventHandler<KeyEvent>() {
public void handle(final KeyEvent evento) {
if (evento.getCode() == KeyCode.ENTER) {
evento.consume();
((Node)evento.getSource()).fireEvent(new KeyEvent(evento.getSource(), evento.getTarget(), evento.getEventType(), null, "TAB", KeyCode.TAB, false, false, false, false));
}
}
};
private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
if(elemento instanceof Pane){
Pane painel= (Pane) elemento;
for(Node filho :painel.getChildren()){
if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
|| filho instanceof DatePicker || filho instanceof BigDecimalField)
filho.setOnKeyPressed(processadorEnterEmCampo);
else if(filho instanceof Button)
filho.setOnKeyPressed(processadorEnterEmBotao);
else
adicionarProcessadorEventoEnterPressionado(filho);
}
}
}
Приведенный выше код работает как шарм, за исключением BigDecimalField и DatePicker. Он просто не запускает код обработчика, когда я нажимаю клавишу ВВОД, только когда я нажимаю клавишу SHIFT, код обработчика выполняется. Я считаю, что это происходит, потому что эти компоненты уже имеют некоторую функциональность с клавишей ENTER. Что я мог сделать для обработки нажатия клавиши ВВОД в этих компонентах?
1 ответ
Вместо использования setOnKeyPressed теперь я использую addEventFilter:
private void adicionarProcessadorEventoEnterPressionado(Node elemento) {
if(elemento instanceof Pane){
Pane painel= (Pane) elemento;
for(Node filho :painel.getChildren()){
if(filho instanceof TextField || filho instanceof ComboBox || filho instanceof CheckBox
|| filho instanceof DatePicker || filho instanceof BigDecimalField)
filho.addEventFilter(KeyEvent.KEY_PRESSED,processadorEnterEmCampo);
else if(filho instanceof Button)
filho.setOnKeyPressed(processadorEnterEmBotao);
else
adicionarProcessadorEventoEnterPressionado(filho);
}
}
}
Поскольку я подозревал, что реализация компонентов потребляет событие до того, как оно попадет в обработчик, лучше всего было добавить addEventFilter:
Фильтр вызывается, когда узел получает Событие указанного типа во время фазы захвата доставки события.