系統托盤是桌面應用常見需求,讓程式長駐背景並提供快速選單存取。本文分享一份基於 java.awt.SystemTray 的完整實現,支援右鍵選單、雙擊還原視窗、訊息氣泡提示等核心功能。
public class SystemTrayDemo extends JFrame {
private TrayIcon trayIcon = null;
public SystemTrayDemo() {
this.setTitle("系統托盤");
jbInit();
this.setSize(200, 250);
this.setLocation(300, 300);
}
public void jbInit() {
if (SystemTray.isSupported()) {
SystemTray tray = SystemTray.getSystemTray();
Image image = Toolkit.getDefaultToolkit().getImage("newrobot1_256.png");
PopupMenu popupMenu = new PopupMenu();
MenuItem exitItem = new MenuItem("exit");
MenuItem menuItema = new MenuItem("menu a");
MenuItem menuItemb = new MenuItem("menu b");
MenuItem menuItemc = new MenuItem("menu c");
MenuItem menuItemd = new MenuItem("menu d");
exitItem.addActionListener(e -> {
try { System.exit(0); } catch (Exception ex) { ex.printStackTrace(); }
});
popupMenu.add(menuItema);
popupMenu.add(menuItemb);
popupMenu.add(menuItemc);
popupMenu.add(menuItemd);
popupMenu.add(exitItem);
trayIcon = new TrayIcon(image, "系統托盤{thu}", popupMenu);
trayIcon.setImageAutoSize(true); // 關鍵:自動縮放圖示至適當大小
trayIcon.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
trayIcon.displayMessage("message", "double click", TrayIcon.MessageType.INFO);
showIT(true);
}
}
});
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(e);
}
} else {
System.out.println("你的系統不支援系統托盤");
}
// 業務邏輯:主視窗顯示圖片
ImageIcon icon = new ImageIcon();
try {
URL url = new URL("newrobot1_256.png");
icon = new ImageIcon(url);
} catch (Exception e) { }
JLabel label = new JLabel();
label.setIcon(icon);
this.add(label);
}
public void showIT(boolean visible) {
if (this.isVisible() != visible) this.setVisible(visible);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(() -> new SystemTrayDemo().setVisible(true));
}
}
SystemTray.isSupported() 必須先調用,避免不支援平台拋出異常trayIcon.setImageAutoSize(true) 確保不同 DPI 環境下圖示不失真getClickCount() == 2,呼叫 displayMessage 顯示氣泡提示並還原主視窗PopupMenu 與 MenuItem,非 Swing 的 JPopupMenu