这是一个有趣的bug (阅读:我可能遗漏了一些东西),我花了两天的时间试图追踪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);
}
}如果我运行它并关闭窗口,我会期望它被释放,并且各种线程终止。如果我注释掉"Make a TrayIcon“try/catch块,情况就是这样。
sysTray.add()行似乎不会创建异常,但是在代码中使用它会阻止线程终止,因为代码会挂起AWT-EventQueue Thread中的wait()。
这是个bug,还是我漏掉了什么?
干杯。
发布于 2011-12-11 08:55:55
要让程序在关闭时正常终止,需要将DefaultCloseOperation设置为EXIT_ON_CLOSE,如下所示:
GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);EXIT_ON_CLOSE是在JFrame中定义的,因此您不需要定义它或从任何地方导入它。
有关更多退出操作,请查看API:
https://stackoverflow.com/questions/8461092
复制相似问题