2012-08-28 21 views
53

In Swing è sufficiente utilizzare setDefaultCloseOperation() per arrestare l'intera applicazione quando la finestra viene chiusa.Come chiudere un'applicazione JavaFX alla chiusura della finestra?

Tuttavia in JavaFX non riesco a trovare un equivalente. Ho più finestre aperte e voglio chiudere l'intera applicazione se una finestra è chiusa. Qual è il modo di farlo in JavaFX?

Edit:

ho capito che posso ignorare setOnCloseRequest() per eseguire alcune operazioni sulla finestra vicino. La domanda è quale operazione dovrebbe essere eseguita per terminare l'intera applicazione?

stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     stop(); 
    } 
}); 

Il metodo stop() definito nella Application classe non fa nulla.

risposta

67

L'applicazione si interrompe automaticamente quando l'ultimo Stage è chiuso. In questo momento, il metodo della classe Applicationstop() è chiamata, in modo da non avete bisogno di un equivalente setDefaultCloseOperation()

Se si desidera interrompere l'applicazione prima che, si può chiamare Platform.exit(), per esempio nella tua onCloseRequest chiamata.

Si possono avere tutte queste informazioni sulla pagina javadoc di Application: http://docs.oracle.com/javafx/2/api/javafx/application/Application.html

+4

Per riferimento (come menzionato nella pagina javadoc collegata): L'applicazione viene arrestata automaticamente solo se l'attributo 'implicitExit' su' Piattaforma' è impostato su 'true'. – netzwerg

3

Hai provato questo .. setOnCloseRequest

setOnCloseRequest(EventHandler<WindowEvent> value) 

C'è uno example

+0

Questo non è il problema. Si prega di consultare la mia modifica. –

+0

è meglio del metodo stop()? – Carbos

21

Per riferimento, ecco un'implementazione minima utilizzando Java 8:

@Override 
public void start(Stage mainStage) throws Exception { 

    Scene scene = new Scene(new Region()); 
    mainStage.setWidth(640); 
    mainStage.setHeight(480); 
    mainStage.setScene(scene); 

    //this makes all stages close and the app exit when the main stage is closed 
    mainStage.setOnCloseRequest(e -> Platform.exit()); 

    //add real stuff to the scene... 
    //open secondary stages... etc... 
} 
14
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     Platform.exit(); 
     System.exit(0); 
    } 
} 
+0

Voglio solo sottolineare che in questo caso il metodo stop() non verrà chiamato affatto (almeno con JavaFX 8 su Windows) perché System.exit() chiude tutto troppo presto. In questo caso potresti chiamare solo System.exit(). Ma se vuoi fare qualcosa nel metodo stop(), ti consiglio di chiamare Platform.exit() qui e System.exit (0) alla fine del metodo stop() se necessario. – tomorrow

25

Alcune delle risposte fornite hanno fatto non funziona per me (javaw.exe è ancora in esecuzione dopo aver chiuso la finestra) o, eclipse ha mostrato un'eccezione dopo che l'applicazione è stata chiusa.

D'altra parte, questo funziona perfettamente:

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent t) { 
     Platform.exit(); 
     System.exit(0); 
    } 
}); 
+0

funziona anche con il metodo stop? – Carbos

+0

Stavi facendo qualcosa di multi-thread? Mi sembra che non stia chiudendo (per me) quando si utilizza ExecutorService (che potrebbe essere il comportamento previsto, non ho ancora controllato i documenti). – Manius

+0

Per me, aggiungendo 'System.exit (0); 'era l'unica cosa che ha reso il processo terminato dopo la chiusura della finestra principale. – Johannes

3

Utilizzo di Java 8 questo ha funzionato per me:

@Override 
public void start(Stage stage) { 
    Scene scene = new Scene(new Region()); 
    stage.setScene(scene); 

    /* ... OTHER STUFF ... */ 

    stage.setOnCloseRequest(e -> { 
     Platform.exit(); 
     System.exit(0); 
    }); 
} 
0

Questo sembrava funzionare per me:

EventHandler<ActionEvent> quitHandler = quitEvent -> { 

     System.exit(0); 

    }; 
    // Set the handler on the Start/Resume button 
    quit.setOnAction(quitHandler); 
0

Try

System.exit(0); 

questo dovrebbe terminare thread main e terminare il programma principale

-2

È necessario sostituire il metodo "stop()" nell'istanza dell'applicazione per farlo funzionare. Se hai scavalcato anche "stop()" vuoto, l'applicazione si chiude con grazia dopo che l'ultima fase è stata chiusa (in realtà l'ultimo stadio deve essere lo stadio principale per farlo funzionare completamente come dovrebbe essere). In questo caso non sono necessarie altre chiamate Platform.exit o setOnCloseRequest.

+0

si prega di fornire un esempio di lavoro - non ha funzionato per me –