2011-12-11 11 views
3

Java Swingの興味深いバグ(読んだことがあります)を読んでいます。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); 
    } 
} 

私がこれを実行してウィンドウを閉じると、私はそれを処分し、様々なスレッドを終了させることを期待します。これは、「TrayIconを作成する」try/catchブロックをコメントアウトする場合です。

sysTray.add()行は例外を作成しないようですが、AWT-EventQueueスレッドのwait()でコードがハングするため、コード内にそのスレッドが終了するのを停止します。

これはバグですか、迷っていますか?

乾杯。

答えて

2

あなたはそれを閉じるとき、あなたはこのように、EXIT_ON_CLOSEDefaultCloseOperationを設定する必要が正しく終了するプログラムを取得するには:

GUI.setDefaultCloseOperation(EXIT_ON_CLOSE); 

EXIT_ON_CLOSEJFrameで定義されているので、あなたはそれを定義する必要はありませんかどこからでもインポートできます。

は、より多くの終了操作のAPIをチェック:

+0

おかげで非常に多く、私はDISPOSE_ON_CLOSEがGCのためにそれをフラグが立てられ、一方EXIT_ON_CLOSEは、メモリ内のいくつかのものを残したという理解でした。私は読んでみましょう。 – Hemmels

+1

@Hemmels:JVMを終了すると、ホストシステムは割り当てられたメモリを回復できます。 GCはその時点で無関係になります。 – trashgod

関連する問題