2016-09-05 2 views
3

У меня есть число TextField объектов внутри всплывающего окна под названием dialog (type: Stage).Установить событие KeyPressed для TextField в JavaFX

Я пытаюсь определить обработчик действий для них, который направлен на закрытие сцены после нажатия кнопки перехода на клавиатуру.

Вот моя функция для сцены более близкого:

public void escapeKeyPressed(KeyCode keyCode , Stage dialog){ 
    if (keyCode == KeyCode.ESCAPE){ 
     dialog.close(); 
     System.out.println("escape got called"); 
    } 
} 

и следующее, где я это называю:

textUsername.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog);}); 
textAddress.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog);}); 
textwp.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog);}); 
textState.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog);}); 
textloginName.setOnAction((event) -> {escapeKeyPressed(KeyCode.ESCAPE ,dialog);}); 

Проблема заключается в том, что функция не будет вызвана.

Любая идея, как я могу это исправить? Это cо спаренной отметить, что функция сама по себе работает отлично, если я заменю абонента из setOnAction();

+1

Если у вас есть диалог, вы должны рассмотреть вопрос об использовании Alert (javafx.scene.control.Alert) класса, с ButtonType.CANCEL. Таким образом, вы получите правильно помеченную кнопку в правильном порядке ОС, на котором запущено приложение AND Esc (на платформах, где это считается поведением по умолчанию) закройте диалог. – rli

ответ

4

setOnAction документации для TextField состояний:

обработчик действий, связанных с этим текстовым полем, или нулевое значение, если нет обработчика действий . Обработчик действия обычно называется , когда пользователь вводит ключ ENTER.

Поэтому escapeKeyPressed будет выполняться на Enter нажатия клавиши. Что произойдет сейчас: если вы нажмете , введите ключ, он вызовет этот метод с KeyCode.ESCAPE, поэтому он закроет диалог.

Использование setOnKeyPressed вместо setOnAction:

Определяет функцию, которая будет вызвана, когда этот узел или его дочерний узел имеет фокус ввода и нажатия клавиши.

Вместо того, чтобы пройти KeyCode.ESCAPE, пройти KeyCode в KeyEvent, что вы можете получить с getCode():

textUsername.setOnKeyPressed(event -> escapeKeyPressed(event.getCode(), dialog)); 
Смежные вопросы