2013-02-25 2 views
6

Ich mache eine Desktop-Anwendung, die mit dem Server ein- und ausloggen kann.Wie erfasse ich Ereignis für forcefully oder unerwartet schließen in JavaFx?

muss ich von der Anwendung abzumelden, wenn jemand das Fenster schließen, so dass ich mit diesen Codes

primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
       @Override 
       public void handle(WindowEvent event) { 
        event.consume(); 
        closeWindow(); 
       } 
      }); 

wo Close() Abmelden und andere damit zusammenhängende Schritte enthält.

Jetzt gibt es ein Problem, wenn die Anwendung unerwartet beendet wird oder wenn jemand den Task Manager zwangsweise beendet/schließt (durch Beenden des Prozesses).

Hat JavaFX irgendein Ereignis, das gewaltsam beendet oder unerwartet beendet wird? Oder wenn es irgendeine Methode gibt, um es zu stoppen?

Antwort

3

Wenn Ihre Anwendung über TaskManager geschlossen wird, verwenden Sie nur die VM shutdown hook.

Es gibt einige Beispiele, z.B. here.

+0

Ich habe versucht mit Shutdown-Hook, aber es funktioniert nicht, wenn ich Anwendung von TaskManager schließen. –

3

Es gibt eine Methode

@Override 
public void stop() throws Exception { 
    super.stop(); 
    System.out.println("logout"); 
} 

in Anwendungsklasse.

+0

das funktioniert nicht, wenn die Anwendung zwangsweise geschlossen wird. –

+0

Wir denken, es gibt keine Hoffnung zu etw, wenn OS einen Prozess tötet –

+0

Wenn Sie keine Theorie über Betriebssysteme kennen, können Sie es lesen, aber kurz gesagt, wenn OS einen Prozess zu töten beabsichtigt, was getan wird Wenn ein Taskmanager verwendet wird, wird ein Prozess gestoppt und aus OM entfernt. Die vom Prozess verwendeten Ressourcen werden frei. Und normalerweise gibt es keine Möglichkeit, vorher einen Code auszuführen. –

0

Wenn Sie eine Aufgabe für diese Abmeldeprozedur verwenden, versuchen Sie, mit der Methode setDaemon zu spielen. Ich löste einen ähnlichen Fall, indem ich ein "Lade" -Fenster zeigte und das Fenster schloss, nachdem die Aufgabe abgeschlossen wurde. Sie können das auch versuchen.

1
public class Gui extends Application { 

    static { 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      @Override 
      public void run() { 
       closeWindow(); 
      } 
     }); 
    } 

    @Override 
    public final void start(Stage primaryStage) throws Exception { 
     // ... 
    } 

    @Override 
    public void stop() throws Exception { 
     // ... 
     System.exit(0); 
    } 
}