3
Java Swing中有一個有趣的錯誤(我可能錯過了某些東西)我花了最近2天試圖跟蹤。Java SystemTray.add(TrayIcon)在出口掛起Swing GUI
首先要做的事情是創建一個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線程中的wait()上。
這是一個錯誤,或者我錯過了什麼?
乾杯。
非常感謝,我是其中的EXIT_ON_CLOSE留在記憶一些東西的理解,而DISPOSE_ON_CLOSE標記它GC。我會讀一讀。 – Hemmels
@Hemmels:退出JVM允許主機系統恢復任何分配的內存; GC在當時變得無關緊要。 – trashgod