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

标签 java swing user-interface

这是 Java Swing 中一个有趣的错误(读作:我可能遗漏了一些东西),我在过去 2 天里试图追踪。

首先,创建一个 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 block ,就会出现这种情况。

sysTray.add() 行似乎没有创建异常,但在代码中包含它会阻止线程终止,因为代码卡在 AWT-EventQueue 线程中的 wait() 上。

这是错误还是我遗漏了什么?

大家干杯。

最佳答案

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

GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);

EXIT_ON_CLOSEJFrame 中定义,因此您无需定义它或从任何地方导入它。

检查 API更多退出操作:

关于java SystemTray.add(TrayIcon) 在退出时挂起 Swing GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461092/

相关文章:

java - 来自 jsp :include being ignored? 的 response.sendRedirect()

java - 如何将 Java 类与 Python 集成?

java - 出于 glasspane 的目的,为什么 Swing 中的输入元素似乎不被视为 JPanel 的一部分?

java - 对 Swing 对象进行分组

class - 如何将 java.lang.Class 对象打印到文件?

java - 获取 org.hibernate.AnnotationException : Unknown entity name: int

java - 使 Enter 键充当 java 中 jtextfield、jcombobox、jspinner 的 Tab 键

Java JToggleButton 在 While 循环中卡住

手动Java GUI开发

java - JTable 排序后添加行 bug