首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java (TrayIcon)在退出时挂起Swing SystemTray.add

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

Stack Overflow用户
提问于 2011-12-11 08:45:35
回答 1查看 1K关注 0票数 3

这是一个有趣的bug (阅读:我可能遗漏了一些东西),我花了两天的时间试图追踪Java Swing。

首先,创建一个SSCCE。这就是你要的。

代码语言:javascript
复制
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 Thread中的wait()。

这是个bug,还是我漏掉了什么?

干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-11 08:55:55

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

代码语言:javascript
复制
GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);

EXIT_ON_CLOSE是在JFrame中定义的,因此您不需要定义它或从任何地方导入它。

有关更多退出操作,请查看API

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8461092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档