2015-04-09 24 views
9

Od jdk 8u40 używam nowego interfejsu API javafx.scene.control.Alert, aby wyświetlić okno dialogowe potwierdzenia. W poniższym przykładzie przycisk "Tak" jest domyślnie skupiony zamiast przycisku "Nie":Domyślny przycisk JavaFX w oknie alarmowym

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; 
} 

I nie wiem jak to zmienić.

EDIT:

Oto zrzut ekranu z wynikiem gdzie „Tak” przycisk koncentruje domyślnie:

enter image description here

Odpowiedz

12

Nie jestem pewien, czy następujące jest sposobem zwykle to zrobić, ale możesz zmienić domyślny przycisk, przeglądając przyciski i ustawiając domyślne zachowanie:

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

Jeśli masz al ook w klasie (prywatne) ButtonBarSkin, istnieje metoda o nazwie doButtonOrderLayout(), która wykonuje układ przycisków, w oparciu o pewne domyślne zachowanie systemu operacyjnego.

Wewnątrz niej można przeczytać:

/* teraz, że wszystkie przyciski zostały umieszczone, musimy zapewnić ostrość jest zestaw na odpowiednim przycisku. [...] Jeśli tak, prosimy o skupienie się na tym domyślnym przycisku . */

Ponieważ ButtonType.YES jest przyciskiem domyślnym, to będzie ten zogniskowany.

Tak więc odpowiedź @ymene jest poprawna: możesz zmienić domyślne zachowanie, a następnie skoncentrować się na NO.

Albo możesz po prostu uniknąć użycia tej metody, ustawiając BUTTON_ORDER_NONE w buttonOrderProperty(). Teraz pierwszy przycisk będzie skupiony, dlatego musisz najpierw umieścić przycisk NO.

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

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

Zauważ, że YES nadal mają domyślne zachowanie: Oznacza to NO może być wybrany z spacji (przycisk skoncentrowany), natomiast YES zostanie wybrany po naciśnięciu ENTER (domyślnego przycisku).

Alert dialog

Albo też można zmienić domyślne zachowanie następujące @crusam odpowiedź.

+0

Patrz także: http://stackoverflow.com/a/37610648/59087 –

2

Prosta funkcja dzięki 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; 
} 

Zastosowanie:

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 
} 
Powiązane problemy