2015-08-17 4 views
5

Se creo solo una classe vuota che si estende da javafx.scene.control.Dialog<R>, non si chiuderà quando premo il pulsante "x" in alto a destra angolo.javafx.scene.control.Dialog <R> non si chiuderà premendo "x"

Come si implementa questo comportamento? L'API sembra dirmi che devo implementare un pulsante di chiusura. Ma nel mio caso non voglio un pulsante di chiusura, voglio solo chiudere la finestra con il tasto x o premendo ESC. È possibile?

risposta

10

Per aggirare questo problema, è possibile aggiungere un pulsante di chiusura nascosta alla finestra di dialogo.

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class DialogClosure extends Application{ 

    @Override 
    public void start(Stage stage) throws Exception { 
     Button openDialog = new Button("Open Dialog"); 
     openDialog.setOnAction(event -> { 
      Dialog dialog = new Dialog(); 
      dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); 
      Node closeButton = dialog.getDialogPane().lookupButton(ButtonType.CLOSE); 
      closeButton.managedProperty().bind(closeButton.visibleProperty()); 
      closeButton.setVisible(false); 
      dialog.showAndWait(); 
     }); 

     stage.setScene(new Scene(openDialog)); 
     stage.show(); 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Poi la finestra si riunisce sia la vostra esigenza di poter essere chiuso tramite vicino icona della finestra del sistema a finestre nativo così come il requisito JavaFX dialogo di includere un pulsante di chiusura nella finestra di dialogo per l'icona vicino al lavoro.

In alternativa, è possibile utilizzare uno stage con showAndWait anziché Dialog. Uno stage senza pulsanti inclusi è chiudibile tramite l'icona della finestra chiusa del sistema di finestre.

6

Per citare il Api Docs:

JavaFX finestre di dialogo possono essere chiuse solo 'anomalo' (come sopra definito) in due situazioni:

  1. Quando la finestra ha solo un pulsante, o

  2. Quando la finestra di dialogo ha più pulsanti, purché uno di essi soddisfi uno dei seguenti requisiti:

    1. Il pulsante ha un ButtonType di cui ButtonData è di tipo ButtonData.CANCEL_CLOSE.
    2. Il pulsante ha un ButtonType il cui ButtonData restituisce true quando viene chiamato ButtonData.isCancelButton().

    ...

Quindi, o aggiungere almeno un bottone o multiple, e uno di loro è di tipo ButtonData.CANCEL_CLOSE, ad esempio:

Dialog<ButtonType> dialog = new Dialog<>(); 
dialog.getDialogPane().getButtonTypes().add(new ButtonType("Got it!", ButtonData.CANCEL_CLOSE)); 
dialog.setContentText("test"); 
dialog.showAndWait(); 

Modifica:

Questo comportamento è implementato in javafx.scene.control.FXDialog.requestPermissionToClose(Dialog<?>), ma il reale FXDialog mostrato è HeavyweightDialog che non è API pubblica quindi non è realmente un punto di estensione.

+1

Come è logico che sia necessario implementare un pulsante di chiusura per poter utilizzare un altro pulsante di chiusura? Perché devi avere entrambi? C'è qualcos'altro che posso usare se ho bisogno di restituire un risultato dalla finestra senza volere alcun pulsante (eccetto quelli nella barra del titolo, come "x"). Inizialmente ho creato la mia classe da zero per implementare questo comportamento, ma non sono riuscito a restituire un risultato. –

+0

@JonatanStenbacka L'unica soluzione sarebbe implementare il proprio 'FXDialog' .. ma non lo consiglierei. Ma non riesco a immaginare un dialogo senza pulsanti ...? – eckig

+0

Confermando che questa è l'unica opzione di lavoro che ho visto. Fantastico grazie. – JonasAnon

11

La soluzione alternativa di @eckig o @jewelsea funziona abbastanza bene. Ma vorrei usare qualcosa di simile a questo:

// Somewhere in code 
Dialog<?> dialog = new Dialog<>(); 
Window window = dialog.getDialogPane().getScene().getWindow(); 
window.setOnCloseRequest(event -> window.hide()); 

io non conosco nessun vincoli di questo uso, ma ha funzionato per me. E raccomando di inizializzare la finestra subito dopo l'inizializzazione della finestra di dialogo, come sopra.

1

Nel mio Dialog<ButtonType> sto usando quello @vbargl detto:

Window window = alert.getDialogPane().getScene().getWindow(); 
window.setOnCloseRequest(event -> window.hide()); 

Si chiude la finestra di dialogo, ma mi sta portando un regalo errore alcun valore.

Per evitarlo, sto anche verificando result.get() e che result.isPresent().