2015-04-09 5 views
9

Начиная с jdk 8u40, я использую новый API javafx.scene.control.Alert для отображения диалогового окна подтверждения. В приведенном ниже примере, «Да» кнопка сфокусировано по умолчанию вместо кнопки «Нет»:JavaFX по умолчанию сфокусированная кнопка в диалоговом окне оповещений

public boolean showConfirmDialog(String title, String header, String content, AlertType alertType) { 
    final Alert alert = new Alert(alertType); 
    alert.setTitle(title); 
    alert.setHeaderText(header); 
    alert.setContentText(content); 

    alert.getButtonTypes().clear(); 
    alert.getButtonTypes().addAll(ButtonType.YES, ButtonType.NO); 

    final Optional<ButtonType> result = alert.showAndWait(); 
    return result.get() == ButtonType.YES; 
} 

И я не знаю, как изменить его.

EDIT:

Вот скриншот результата, когда «Да» кнопка сфокусировано по умолчанию:

enter image description here

ответ

12

Я не уверен, если следующее является способ, как правило, делают это, но вы можете изменить кнопку по умолчанию, просмотрев кнопки и установив по умолчанию поведение:

public boolean showConfirmDialog(String title, String header, String content, AlertType alertType) { 
    final Alert alert = new Alert(alertType); 
    alert.setTitle(title); 
    alert.setHeaderText(header); 
    alert.setContentText(content); 

    alert.getButtonTypes().clear(); 
    alert.getButtonTypes().addAll(ButtonType.YES, ButtonType.NO); 

    //Deactivate Defaultbehavior for yes-Button: 
    Button yesButton = (Button) alert.getDialogPane().lookupButton(ButtonType.YES); 
    yesButton.setDefaultButton(false); 

    //Activate Defaultbehavior for no-Button: 
    Button noButton = (Button) alert.getDialogPane().lookupButton(ButtonType.NO); 
    noButton.setDefaultButton(true); 

    final Optional<ButtonType> result = alert.showAndWait(); 
    return result.get() == ButtonType.YES; 
} 
3

Если у вас есть al ook at (private) ButtonBarSkin класс, существует метод под названием doButtonOrderLayout(), который выполняет компоновку кнопок, основанных на некоторых поведении ОС по умолчанию.

Внутри него вы можете прочитать:

/* теперь, что все кнопки были размещены, мы должны обеспечить внимание набор на правильную кнопку. [...] Если это так, мы обращаем внимание на эту кнопку по умолчанию. */

С ButtonType.YES - это кнопка по умолчанию, она будет фокусироваться.

Так ответ @ymene правильный: вы можете изменить поведение по умолчанию, а затем сфокусированное будет NO.

Или вы можете просто не использовать этот метод, установив BUTTON_ORDER_NONE в buttonOrderProperty(). Теперь первая кнопка будет иметь фокус, поэтому вам нужно сначала поставить кнопку NO.

alert.getButtonTypes().setAll(ButtonType.NO, ButtonType.YES); 

ButtonBar buttonBar=(ButtonBar)alert.getDialogPane().lookup(".button-bar"); 
buttonBar.setButtonOrder(ButtonBar.BUTTON_ORDER_NONE); 

Обратите внимание, что YES все равно будет иметь поведение по умолчанию: Это означает, что NO может быть выбран с пробела (целенаправленный кнопка), в то время как YES будет выбран при нажатии кнопки ввода (кнопка по умолчанию).

Alert dialog

Или вы можете изменить также поведение по умолчанию следующего @crusam ответа.

+0

Смотрите также: http://stackoverflow.com/a/37610648/59087 –

2

Простая функция благодаря crusam:

private static Alert setDefaultButton (Alert alert, ButtonType defBtn) { 
    DialogPane pane = alert.getDialogPane(); 
    for (ButtonType t : alert.getButtonTypes()) 
     ((Button) pane.lookupButton(t)).setDefaultButton(t == defBtn); 
    return alert; 
} 

Использование:

final Alert alert = new Alert( 
     AlertType.CONFIRMATION, "You sure?", ButtonType.YES, ButtonType.NO); 
if (setDefaultButton(alert, ButtonType.NO).showAndWait() 
     .orElse(ButtonType.NO) == ButtonType.YES) { 
    // User selected the non-default yes button 
} 
Смежные вопросы