Java 6 引入 java.awt.SystemTray 與 TrayIcon,讓應用程式能最小化至系統托盤(Windows 任務列通知區、Gnome/KDE 通知區)。本文提供一個完整可執行的範例,展示托盤圖示、右鍵選單、雙擊還原、氣泡訊息與圖示閃爍效果。
public class TrayDemo extends JFrame implements ActionListener {
private SystemTray tray;
private TrayIcon trayIcon;
private Timer blinkTimer;
private ImageIcon icon1, icon2;
private boolean toggle = false;
public TrayDemo() {
// 初始化 UI、檢查系統支援、建立托盤圖示與選單
if (SystemTray.isSupported()) {
initTray();
}
// 視窗狀態監聽:最小化時隱藏至托盤
addWindowStateListener(e -> {
if (e.getNewState() == ICONIFIED) hideToTray();
});
}
private void initTray() {
tray = SystemTray.getSystemTray();
icon1 = new ImageIcon("icon1.png");
icon2 = new ImageIcon("icon2.png");
PopupMenu popup = new PopupMenu();
MenuItem show = new MenuItem("顯示視窗");
MenuItem exit = new MenuItem("退出");
popup.add(show); popup.add(exit);
trayIcon = new TrayIcon(icon1.getImage(), "托盤範例", popup);
trayIcon.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) restoreFromTray();
}
});
show.addActionListener(e -> restoreFromTray());
exit.addActionListener(e -> System.exit(0));
// 閃爍計時器
blinkTimer = new Timer(1000, e -> {
trayIcon.setImage(toggle ? icon2.getImage() : icon1.getImage());
toggle = !toggle;
});
blinkTimer.start();
}
private void hideToTray() {
try { tray.add(trayIcon); setVisible(false); }
catch (AWTException ex) { ex.printStackTrace(); }
}
private void restoreFromTray() {
tray.remove(trayIcon);
setVisible(true);
setExtendedState(NORMAL);
}
public static void main(String[] args) {
new TrayDemo().setVisible(true);
}
}
SystemTray.isSupported() 確認平台支援。TrayIcon 建構子可指定圖示、工具提示、彈出選單。Timer 定期切換圖示達到閃爍提醒效果。