2013-02-25 25 views
6

我正在製作一個桌面應用程序,它具有服務器的登錄和註銷功能。如何在JavaFx中捕獲強制退出或意外關閉的事件?

我需要每當有人關閉窗口申請註銷,所以我用這些代碼

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

其中closeWindow()包含註銷等相關措施。

現在應用程序意外關閉或某人強行退出/關閉它從任務管理器(通過結束進程)時出現問題。

JavaFX是否有任何事件可以強制退出或意外關閉?或者如果有任何方法阻止它?

回答

3

當您的應用程序通過TaskManager關閉時,您唯一的選擇是使用虛擬機的shutdown hook

有一些例子,例如, here

+0

我試過使用shutdown hook,但是當我從TaskManager關閉應用程序時它不工作。 – 2013-02-25 12:33:56

3

有一個在應用程序類的方法

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

+0

當強制關閉應用程序時,此工作不起作用。 – 2013-02-25 12:35:15

+0

我們認爲,當操作系統殺死一個進程時,沒有希望做到這一點 – 2013-02-25 12:35:41

+0

如果你不懂操作系統的任何理論,你可以閱讀它,但是馬上說,當操作系統打算殺死一個進程時, ,當您使用任務管理器時,進程停止並從OM中刪除,進程使用的資源變爲空閒。通常,在這之前運行任何代碼都是不可能的。 – 2013-02-25 12:40:49

0

如果您正在使用該註銷過程的任務,請嘗試使用setDaemon方法進行遊戲。我通過顯示「加載」窗口並在任務完成後關閉該窗口來解決類似的情況。你也可以嘗試。

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); 
    } 
} 
相關問題