java SystemTray.add(TrayIcon)在退出时挂起Swing GUI

时间:2011-12-11 00:45:35

标签: java swing user-interface

这是一个有趣的错误(阅读:我可能已经遗漏了一些东西)在Java Swing中我花了最近两天试图追踪。

首先,创建一个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);
    }
}

如果我运行它并关闭Window,我希望它可以处理,并且各种Threads都要终止。如果我注释掉“Make a TrayIcon”try / catch块,就会出现这种情况。

sysTray.add()行似乎没有创建Exception,但是在代码中使用它会阻止Threads终止,因为代码在AWT-EventQueue Thread中的wait()上挂起。

这是一个错误,还是我遗漏的东西?

干杯。

1 个答案:

答案 0 :(得分:2)

要让程序在关闭时正常终止,您需要将DefaultCloseOperation设置为EXIT_ON_CLOSE,如下所示:

GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);
{p> EXIT_ON_CLOSEJFrame中定义,因此您无需定义或从任何地方导入。

检查API以获取更多退出操作: