2015-04-09 2 views
9

Poiché jdk 8u40, sto utilizzando la nuova API javafx.scene.control.Alert per visualizzare una finestra di dialogo di conferma. Nell'esempio che segue, "Sì" pulsante è focalizzato per default al posto di pulsante "No":Pulsante di messa a fuoco predefinita di JavaFX nella finestra di dialogo degli avvisi

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

E non so come cambiarlo.

EDIT:

Ecco uno screenshot del risultato in cui "Yes" pulsante è focalizzata in modo predefinito:

enter image description here

risposta

12

Non sono sicuro se ciò che segue è il modo per farlo di solito questo, ma è possibile modificare il pulsante predefinito cercando i pulsanti e impostando il comportamento predefinito da soli:

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

Se si ha ook alla classe (privata) ButtonBarSkin, esiste un metodo chiamato doButtonOrderLayout() che esegue il layout dei pulsanti, basato su un comportamento predefinito del sistema operativo.

All'interno di esso, si può leggere questo:

/* ora che tutti i pulsanti sono stati piazzati, dobbiamo garantire attenzione è impostato sul tasto corretto. [...] Se è così, chiediamo attenzione a questo pulsante predefinito . */

Poiché ButtonType.YES è il pulsante predefinito, sarà quello focalizzato.

Quindi la risposta @ymene è corretta: è possibile modificare il comportamento predefinito e quindi quello focalizzato sarà NO.

Oppure è possibile evitare di utilizzare tale metodo, impostando BUTTON_ORDER_NONE nello buttonOrderProperty(). Ora il primo pulsante avrà lo stato attivo, quindi è necessario posizionare prima il pulsante NO.

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

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

noti che YES sarà ancora avere il comportamento di default: Questo significa NO possono essere selezionati con la barra spaziatrice (pulsante di fuoco), mentre saranno selezionati YES Se si preme Invio (pulsante di default).

Alert dialog

Oppure è possibile modificare anche il comportamento di default seguente risposta @crusam.

+0

Vedi anche: http://stackoverflow.com/a/37610648/59087 –

2

Una funzione semplice grazie 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; 
} 

utilizzati:

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 
}