这是一个有趣的错误(阅读:我可能已经遗漏了一些东西)在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()上挂起。
这是一个错误,还是我遗漏的东西?
干杯。
答案 0 :(得分:2)
要让程序在关闭时正常终止,您需要将DefaultCloseOperation
设置为EXIT_ON_CLOSE
,如下所示:
GUI.setDefaultCloseOperation(EXIT_ON_CLOSE);
{p> EXIT_ON_CLOSE
在JFrame
中定义,因此您无需定义或从任何地方导入。
检查API以获取更多退出操作: