2015-05-22 62 views
1

我讀到應該使用DISPOSE_ON_CLOSE而不是EXIT_ON_CLOSE here並且感到困惑。如果沒有其他活動線程/框架,setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)會終止應用程序嗎?
我降落在another question是有a link到美國的文章:此應用程序爲什麼不以DISPOSE_ON_CLOSE結束?

DISPOSE_ON_CLOSE - 自動顯示和處置框架。當這是應用程序中的唯一框架時,VM也將被終止。

如果我的假設是,當它使用DISPOSE_ON_CLOSE作爲其setDefaultCloseOperation()值是正確的應用程序終止,爲什麼不會以下應用程序終止當我點擊退出按鈕?

代碼:

public class Test extends JFrame { 

    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    public Test() { 
     super(); 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setPreferredSize(new Dimension(250, 250)); 
     pack(); 
     setVisible(true); 
    } 
} 

更新:
我目前運行Mac OS的優勝美地,並java -version輸出:

java version "1.8.0_31" 
Java(TM) SE Runtime Environment (build 1.8.0_31-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) 

我跑的程序上我平時的IDE(Eclipse中)和在命令行上,但是在關閉JFrame之後都保持JVM運行。

+2

*「如果沒有其他活動線程/幀,setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)會終止應用程序嗎?」 - 是的,這是測試是否存在任何胭脂(非守護進程)線程的好方法 – MadProgrammer

+0

什麼是發生了什麼?這是一個例外,還是什麼都沒有發生?框架是否真的關閉? – HyperNeutrino

+2

此外,您的測試代碼對我來說工作正常(關閉框架後JVM終止) – MadProgrammer

回答

2

JVM實際上終止。當使用EXIT_ON_CLOSE時,JVM立即退出時會發生什麼情況,當我使用DISPOSE_ON_CLOSE時終止(在我的機器上)需要15秒或更長的時間。
我錯誤地認爲JVM會像第一種情況那樣立即終止,但顯然情況並非如此。我不得不等待的最少時間爲2秒,但通常需要5秒以上,這不斷讓我相信它不會終止,而且我每次都會強制終止JVM。
對我來說,這種行爲感覺就像它不正常,但我想這對最終用戶來說是完全透明的,因爲JFrame一旦退出按鈕被點擊就關閉。

我沒有任何解釋,爲什麼在這樣一個最小的例子中爲這個JVM使用setDefaultCloseOperation()這些值的原因是不同的。

相關問題