这是 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_CLOSE
在 JFrame
中定义,因此您无需定义它或从任何地方导入它。
检查 API更多退出操作:
关于java SystemTray.add(TrayIcon) 在退出时挂起 Swing GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461092/