2015-04-30 6 views
3

Почему диалоговое окно предупреждения JavaFX вызывает команду Platform.exit(); когда я нажимаю клавишу Enter, даже если сфокусированная кнопка в диалоговом окне оповещения - Отмена?Диалоговое окно предупреждения JavaFX игнорирует сфокусированную кнопку

soaStage.setOnCloseRequest(new EventHandler<WindowEvent>() 
{ 
    @Override 
    public void handle(WindowEvent event) 
    { 
     Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
     alert.setTitle("Confirm"); 
     alert.setHeaderText("Are you sure you want to exit?"); 
     alert.setContentText("Press OK to exit, or Cancel to stay."); 
     alert.initOwner(soaStage); 

     Optional<ButtonType> result = alert.showAndWait(); 
     if (result.get() == ButtonType.OK) 
     { 
      Platform.exit(); 
     } 
     else 
     { 
      event.consume(); 
     } 
    } 
}); 
+0

Я считаю, что для активации сфокусированной кнопки вам нужно нажать пробел. Это верно (я думаю) не только для Java/JavaFX. Например, в собственных приглашениях Windows я использую вкладку, чтобы быстро перемещаться и пробел, чтобы активировать выбранную кнопку, а не Enter. Это из моего опыта, хотя, я не знаю, является ли это установленным руководством. –

+0

Я думаю, что вы правы, но я просто попробовал MessageBoxButtons.YesNo в C#, мы можем активировать сфокусированную кнопку либо клавишей Enter, либо Space. –

+0

Я вижу. Мой комментарий был скорее личного взгляда, так как он того стоит. Прочитайте его как «** I **, как пользователь, нажмите пробел, чтобы активировать сфокусированную кнопку, а не вводить». –

ответ

6

кнопки по умолчанию обстрелял введите

Кнопка OK вызывается при нажатии ввести, потому что это default button.

Кнопка по умолчанию - кнопка, которая получает клавиатуру. VK_ENTER нажимает, если другой узел в сцене ее не использует.

В стандартной таблице стилей JavaFX 8 Modena по умолчанию указывается синий цвет, а не серый цвет стандартной кнопки.

Как удалить поведение кнопки по умолчанию

Вы можете удалить это поведение от предупредительного диалога, не делая кнопку OK кнопку по умолчанию:

Button okButton = (Button) alert.getDialogPane().lookupButton(ButtonType.OK); 
okButton.setDefaultButton(false); 

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

На OS X, стандартные диалоги типа оповещений имеют кнопку по умолчанию, которое инициируется ввести, даже если другая кнопка сфокусирована, поэтому стандартное поведение в JavaFX согласуется с этим. Примечание. Чтобы разрешить это поведение в диалоговом окне по умолчанию в OS X, необходимо указать enable full keyboard access.

Если вы измените кнопку OK, чтобы не быть кнопкой по умолчанию, я предлагаю вам изменить свой текст на что-то другое (например, выход для Вашего случая):

okButton.setText("Exit"); 

Как сделать войти огонь сфокусированные кнопки

Теперь, если вы хотите сделать так, чтобы сфокусированная кнопку срабатывает при нажатии клавиши ввести, то вы можете сделать это:

EventHandler<KeyEvent> fireOnEnter = event -> { 
    if (KeyCode.ENTER.equals(event.getCode()) 
      && event.getTarget() instanceof Button) { 
     ((Button) event.getTarget()).fire(); 
    } 
}; 

DialogPane dialogPane = alert.getDialogPane(); 
dialogPane.getButtonTypes().stream() 
     .map(dialogPane::lookupButton) 
     .forEach(button -> 
       button.addEventHandler(
         KeyEvent.KEY_PRESSED, 
         fireOnEnter 
       ) 
     ); 

Примечание: в любом случае сфокусированные кнопки всегда срабатывают при нажатии пространства.

+0

Спасибо, Jewelsea, –

0

Мы можем добавить Ввод, привязанный ко всем кнопкам, создав класс, который необходимо создать сразу после запуска приложения.

public class EnableButtonEnterKey extends ButtonBehavior<Button> { 
    public EnableButtonEnterKey() { 
     super(new Button()); 
     BUTTON_BINDINGS.add(new KeyBinding(ENTER, KEY_PRESSED, "Press")); 
     BUTTON_BINDINGS.add(new KeyBinding(ENTER, KEY_RELEASED, "Release")); 
    } 
} 

При запуске приложения, вызовите

new EnableButtonEnterKey(); 

Вот и все.

Смежные вопросы