2011-12-11 67 views
3

Java Swing中有一個有趣的錯誤(我可能錯過了某些東西)我花了最近2天試圖跟蹤。Java SystemTray.add(TrayIcon)在出口掛起Swing GUI

首先要做的事情是創建一個SSCCE。 在這裏,你去。

class GUI extends JFrame{ 
    public static void main(String[] args){ 
     // All GUI work should be handled in the EDT. 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       new GUI().setVisible(true); 
      } 
     }); 
    } 

    GUI(){ 
     // Make a nice icon 
     ImageIcon img = new ImageIcon(this.getClass().getClassLoader().getResource("img/1.png")); 

     // Make a TrayIcon with the image 
     SystemTray sysTray = SystemTray.getSystemTray(); 
     TrayIcon trayIcon = new TrayIcon(img.getImage()); 
     try { 
      sysTray.add(trayIcon); 
     } 
     catch(AWTException e) { 
      e.printStackTrace(); 
      System.out.println("System Tray unsupported!"); 
     } 

     this.setTitle("Example GUI"); 
     this.setIconImage(img.getImage()); 
     this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    } 
} 

如果我運行這個並關閉窗口,我會期望它處置,並且各種線程終止。如果我註釋掉「Make a TrayIcon」try/catch塊,就是這種情況。

sysTray.add()行似乎不會創建一個異常,但在代碼中阻止線程終止,因爲代碼掛在AWT-EventQueue線程中的wait()上。

這是一個錯誤,或者我錯過了什麼?

乾杯。

回答

2

爲了讓程序正常終止,當你關閉它,你需要設置DefaultCloseOperationEXIT_ON_CLOSE,像這樣:

GUI.setDefaultCloseOperation(EXIT_ON_CLOSE); 

EXIT_ON_CLOSEJFrame定義,因此你不需要去定義它或從任何地方導入它。

檢查API更多的退出操作:

+0

非常感謝,我是其中的EXIT_ON_CLOSE留在記憶一些東西的理解,而DISPOSE_ON_CLOSE標記它GC。我會讀一讀。 – Hemmels

+1

@Hemmels:退出JVM允許主機系統恢復任何分配的內存; GC在當時變得無關緊要。 – trashgod