2011-06-01 38 views
1

假設Runtime.getRuntime().addShutdownHook(new Thread()已正確設置,當Java應用程序窗口(JFrame)關閉時(如果是唯一窗口),ShutdownHook線程將如何被調用)並且處理窗口默認關閉操作是DISPOSE_ON_CLOSEEXIT_ON_CLOSE如何使用DISPOSE_ON_CLOSE或EXIT_ON_CLOSE的窗口關閉操作調用ShutdownHook線程

請注意,對於通過ShutdownHook線程處理的System.exit(0)處理的退出命令,應用程序將正確終止,因爲在Java應用程序退出之前所有關聯的線程都會終止。所以我想通過關閉JFrame窗口完成ShutdownHook線程清理來完成同樣的任務。

+0

發佈您的SSCCE(http://sscce.org),證明問題。 EXIT_ON_CLOSE和DISPOSE_ON_CLOSE都會極大地調用System.exit(),所以不理解「QUIT命令」(不管是什麼)和關閉操作之間的區別。 – camickr 2011-06-01 15:28:53

回答

1

這符合您的規格。如果通過單擊X按鈕關閉框架,則會調用關閉掛鉤。

import javax.swing.*; 

class ShutDownHookDemo { 

    public static void endMessage() { 
     // clean up threads here.. 
     System.out.println("Thanks for using the app."); 
    } 

    public static void main(String[] args) { 
     Thread t = new Thread() { 
      public void run() { 
       endMessage(); 
      } 
     }; 
     Runtime.getRuntime().addShutdownHook(t); 

     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(300,300); 

     f.setVisible(true); 
    } 
} 
+0

你是對的,所以混合中顯然還有其他的事情發生。我也用'JFrame.DISPOSE_ON_CLOSE'運行了你的代碼,它的工作原理是相同的(在打印調試消息時稍微延遲一點,而清理處理稍微優雅些)。 – spots 2011-06-02 05:25:52

0
Runtime.getRuntime().addShutdownHook(...); 
+0

我已經這樣做了。我修改了我的問題,因爲它不夠清楚。 – spots 2011-06-01 15:25:58

2

frame.addWindowListener()並覆蓋windowClosed(WindowEvent e)。從你的問題看來,當窗口關閉時,你只需要一個事件處理。

祝你好運!

相關問題