在 Java 中任務托盤(系統托盤) 圖示顯示/閃爍
在 Java 中任務托盤(系統托盤本節介紹一個用於顯示和閃爍 ) 圖示的實用類別。
Java SE 6 Mustang 中新增了實用程式類別這一特性。 java.awt.SystemTray 、java.awt.TrayIcon 我們將使用一個類別。同時還會提供一個範例應用程序,幫助您了解如何使用它。
系統托盤(任務托盤)功能
系統托盤(任務托盤)指的是電腦螢幕右下角排列的小圖示。 Java SE 6 新增了以下類別以啟用系統托盤功能。
- java.awt.SystemTray
SystemTray 類別表示桌面上的系統匣。 - java.awt.TrayIcon
TrayIcon 物件表示可以新增到系統托盤的托盤圖示。
如何建立閃爍圖標
您可以使用以下網站建立閃爍圖示。
上傳本機圖示以建立閃爍圖示。
https://www.bannerkoubou.com/anime/
範例申請

範例應用程式使用系統托盤實用程式類別 TaskTrayUtil 來實作以下功能。
- 當你啟動它的時候任務托盤に圖示展示。
- 點擊[閃爍按鈕]將任務托盤讓圖示閃爍。
氣球上也印著「放我出去!!」的字樣。 - 點選【停用按鈕】將停止圖示閃爍。
- 任務托盤按一下該圖示(使用滑鼠左鍵點擊)即可將主視窗移至桌面。
- 任務托盤右鍵單擊該圖示以顯示預設的彈出式功能表。
- 當主視窗最小化時任務托盤儲存於。
原始碼獲取
原始碼可從以下位置取得。如果您想編譯它,請將以下圖示也儲存到與原始程式碼相同的位置。
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
導入 javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/**
* 使用 Java 顯示和閃爍任務托盤(系統托盤)圖示。
*
* ◆ 本課程概述
TaskTray 類別是用於處理任務托盤的實用程式。
* 提供以下功能:
* 在工作列中顯示圖示。
* 工作列中將出現一則彈出訊息。
* 使任務托盤閃爍。
*
* ◆ 使用方法
* 將目標 JFrame 類別作為參數傳遞給以下方法。
* ・createTray(JFrame targetFrame)
* ・createTray(final JFrame targetFrame, Image image, PopupMenu menu)
*
*/
public class TaskTrayUtil {
privatestatic JFrame 框架;;
private static PopupMenu defaultMenu;
private static TrayIcon trayIcon;
private static SystemTray tray = SystemTray.getSystemTray();
private static Object INSTANCE_LOCK = new Object();
/**
* 執行範例
* @param args
*/
public static void main(String[] args) {
嘗試 {
// 將外觀設定為 Windows
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
// 標準圖示
final Image img = new ImageIcon(
TaskTrayUtil.class.getResource(
“tray_icon.gif”)).getImage();
最終 JFrame 幀 =
new JFrame("在工作列中顯示並閃爍圖示");
frame.setSize(300, 100);
frame.setIconImage(img);
// 當視窗最小化時,將其最小化到任務匣。
// 新增一個如圖所示的 WindowListener 類別。
frame.addWindowListener(new WindowAdapter() {
public void windowIconified(WindowEvent e) {
frame.setVisible(false);
}
});
JPanel jPanel = new JPanel();
jPanel.setLayout(new FlowLayout());
jPanel.setSize(new Dimension(219, 70));
// 閃爍圖示
最終影像 imgLight =
new ImageIcon(TaskTrayUtil.class.getResource(
“tray_icon_light.gif”)).getImage();
JButton lightButton = new JButton(“点滅”);
lightButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
onAndOffLight(imgLight, null);
displayMessage("訊息", "放我出去!!");
}
});
JButton cancelButton = new JButton(“解除”);
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
刪除圖片(img);
}
});
jPanel.add(lightButton, null);
jPanel.add(cancelButton, null);
frame.add(jPanel);
// 週期結束處理。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 將框架顯示在螢幕中央。
frame.setLocationRelativeTo(null);
// 建立任務托盤。
TaskTrayUtil.createTray(frame);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
*
*/
靜止的 {
建立彈出式選單();
}
/**
* 產生要在工作列中顯示的預設 PopupMenu 功能表。
以下菜單項目可供選擇。
* 從工作列移除
* 將目標應用程式從工作列移除,並將其移至桌面。
把它拿出來。
*(啟動視窗並將其置於最前面。)
這將終止要關閉的應用程式。
*/
private static void createPopupMenu() {
MenuItem getTrayItem = new MenuItem(“タスクトレイから取り出す”);
getTrayItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
積極的();
}
});
MenuItem exitItem = new MenuItem(“終了”);
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeTrayIcon();
TaskTrayUtil.frame.setVisible(false);
TaskTrayUtil.frame.dispose();
System.exit(0);
}
});
defaultMenu = new PopupMenu();
defaultMenu.add(getTrayItem);
defaultMenu.Add(exitItem);
}
/**
* 建立托盤圖示並將其新增至系統托盤。
* 圖示上發生的事件監聽器設定為 targetFrame
設定為*。
* 此處的事件發生在雙擊托盤圖示時。
* 取得目標應用程式。
* @param targetFrame 目標應用程式
*/
public static void createTray(JFrame targetFrame) {
創建托盤(targetFrame, null, null);
}
/**
* 建立托盤圖示並將其新增至系統托盤。
*
* @param targetFrame 目標應用程式
* @param image 要顯示為托盤圖示的圖像。
* 如果為空,則可以使用 getIconImage() 從 targetFrame 取得。
* 圖片僅供參考。
* @param menu 要在工作列中顯示的彈出式選單。
* 如果為空,則顯示預設的彈出式功能表。
*/
public static void createTray(final JFrame targetFrame, Image image,
彈出式選單選單) {
// 如果不支援系統托盤,則退出。
如果 (!SystemTray.isSupported()) {
返回;
}
TaskTrayUtil.frame = targetFrame;
如果 (image == null) {
image = targetFrame.getIconImage();
}
如果 (menu == null) {
選單 = 預設選單;;
}
trayIcon = new TrayIcon(image, targetFrame.getTitle(), menu);
trayIcon.setImageAutoSize(true);
trayIcon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
如果 (SwingUtilities.isLeftMouseButton(e)) {
積極的();
}
}
});
嘗試 {
托盤.添加(托盤圖示);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
/**
* 從工作列移除圖示。
* 此函數必須在應用程式終止時呼叫。
*/
public static void removeTrayIcon() {
移除托盤圖示;;
}
/**
* 讓工作列中的圖示閃爍。
* @param msg 如果需要,點擊閃爍圖示時
* 設定要顯示的訊息。
*/
public static void onAndOffLight(Image lightImg, String msg) {
替換影像(lightImg);
ChangeLightImgAdapter 適配 =
new TaskTrayUtil().new ChangeLightImgAdapter(msg);
trayIcon.addMouseListener(adap);
frame.addWindowListener(adap);
}
/**
* 更改工作列中的圖示。
* @param image 僅當圖示與目前圖示不同時才變更。
*/
public static void replaceImage(Image image) {
同步(實例鎖){
if (!image.equals(trayIcon.getImage())) {
trayIcon.setImage(image);
}
}
}
/**
* 更改工作列中的圖示。
* 如果圖示因某些原因閃爍,
似乎必須使用 {@link SystemTray#remove(TrayIcon)} 將其刪除。
* @param image 僅當圖示與目前圖示不同時才變更。
*/
public static void replaceImageWithDelete(Image image) {
同步(實例鎖){
if (!image.equals(trayIcon.getImage())) {
移除托盤圖示;;
trayIcon.setImage(image);
嘗試 {
托盤.添加(托盤圖示);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 工作列中將出現一則彈出訊息。
* @param 標題
* @param text
*/
public static void displayMessage(String caption, String text) {
if (caption != null || text != null) {
trayIcon.displayMessage(caption, text,
TrayIcon.MessageType.INFO);
}
}
/**
* 將目標應用程式從工作列移除,並將其移至桌面。
把它拿出來。
*/
private static void active() {
// 將幀狀態恢復到正常狀態。
TaskTrayUtil.frame.setExtendedState(JFrame.NORMAL);
TaskTrayUtil.frame.setAlwaysOnTop(true);
TaskTrayUtil.frame.setVisible(true);
TaskTrayUtil.frame.setAlwaysOnTop(false);
}
/**
* 點選閃爍圖示時觸發的事件。
* 監聽器類別。
*/
類別 ChangeLightImgAdapter 實作 WindowListener、MouseListener {
字串 lightImageText;;
public ChangeLightImgAdapter(String lightImageText) {
this.lightImageText = lightImageText;
}
/**
* 點擊任務托盤圖示時
* 顯示彈出訊息。
*/
public void mousePressed(MouseEvent e) {
TaskTrayUtil.displayMessage(null, lightImageText);
}
/**
當目標應用程式啟動時,指示燈會閃爍。
* 恢復圖示。
*/
public void windowActivated(WindowEvent e) {
TaskTrayUtil.replaceImageWithDelete(TaskTrayUtil.frame
.getIconImage());
TaskTrayUtil.frame.removeWindowListener(this);
TaskTrayUtil.trayIcon.removeMouseListener(this);
}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
}
