(圖片來源:http://java.sun.com/docs/books/tutorial/uiswing/misc/systemtray.html)
我們常看到的在工作列右邊的常駐程式,可以用java.awt.SystemTray來寫,搭配java.awt.TrayIcon來顯示圖示。這個功能必須使用Java SE 6或更新版本,這兩個class都在java.awt這個package之下。
由於SystemTray實作成單體(即一個Java程式只能有唯一一個SystemTray的實體或稱物件),所以要取得SystemTray的實體必須呼叫它的static getSystemTray method如下:
SystemTray.getSystemTray();
但在使用之前,可以先檢查該作業系統是否有支援:
SystemTray.isSupported();
支援傳回true,不支援則傳回false
一個SystemTray可以包含一個或多個TrayIcon,使用add() method來增加至SystemTray中:
tray.add(trayIcon);
註:tray表示SystemTray的實體,trayIcon表示TrayIcon的實體。
TrayIcon可以顯示一個tooltip,如上圖的"Sun TrayIcon"黃色小框框:
trayIcon.displayMessage(String caption, String text, TrayIcon.MessageType messageType)
messageType 共有4個參數,如下:
- TrayIcon.MessageType.ERROR – 錯誤訊息
- TrayIcon.MessageType.INFO – 資訊訊息
- TrayIcon.MessageType.NONE – 簡單訊息(無圖示)
- TrayIcon.MessageType.WARNING – 警告訊息
註:trayIcon表示TrayIcon的實體。
TrayIcon可監聽的滑鼠事件:
MouseEvents (pressed, released, and clicked)
- pressed:按住不放
- released:放開
- clicked:按一下
程式碼如下:
/* SysTray.java
* Created on 2008/10/11
* Author Tony
*
*/
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JOptionPane;
public class SysTray {
//icon object
private TrayIcon trayIcon;
//SystemTray object
private SystemTray tray = null;
//取得圖示,如果找不到圖,在系統列上會是空白的
private final Image image = Toolkit.getDefaultToolkit().getImage(“image/tray.gif");
//跳出式選單
private PopupMenu popup = new PopupMenu();
private MenuItem openItem = null;
private MenuItem optionItem = null;
private MenuItem aboutItem = null;
private MenuItem exitItem = null;
public SysTray(){
//檢查OS是否支援SystemTray
if(SystemTray.isSupported()){
//每個Java程式只能有一個SystemTray實體
tray = SystemTray.getSystemTray();
//設定選單
setMenu();
//設定trayIcon(圖片,滑鼠指上去的Tip訊息,選單)
trayIcon = new TrayIcon(image, “我的系統常駐程式", popup);
//設定圖示自動變更尺寸
trayIcon.setImageAutoSize(true);
try {
//把trayIcon加入tray中
tray.add(trayIcon);
} catch (AWTException e) {
System.err.println(“TrayIcon could not be added.");
}
//設定事件
setEvent();
}else{
JOptionPane.showMessageDialog(null, “SystemTray not support!");
}
}
private void setMenu(){
//加入選單
openItem = new MenuItem(“開啟系統主界面");
optionItem = new MenuItem(“選項");
aboutItem = new MenuItem(“關於本程式");
exitItem = new MenuItem(“離開");
popup.add(openItem);
popup.add(optionItem);
popup.add(aboutItem);
//加入分隔線
popup.addSeparator();
popup.add(exitItem);
}
private void setEvent(){
//設定滑鼠事件監聽器
MouseListener mouseListener = new MouseListener() {
//Click
public void mouseClicked(MouseEvent e) {
//按左鍵才顯示Tip訊息
if (e.getButton() == MouseEvent.BUTTON1){
trayIcon.displayMessage(“^____^ :",
“使用displayMessage()可以用來通知使用者訊息喔~~~ \n滑鼠右鍵則可以顯示選單。",
TrayIcon.MessageType.INFO);
}
System.out.println(“Tray Icon – 按一下!");
}
//Enter
public void mouseEntered(MouseEvent e) {
System.out.println(“Tray Icon – 滑鼠進入!無效");
}
//Exit
public void mouseExited(MouseEvent e) {
System.out.println(“Tray Icon – 滑鼠離開!無效");
}
public void mousePressed(MouseEvent e) {
System.out.println(“Tray Icon – 滑鼠按下!");
}
public void mouseReleased(MouseEvent e) {
System.out.println(“Tray Icon – 滑鼠放開!");
}
};
//openItem按鈕事件
ActionListener openListener = new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, “開啟系統主界面");
}
};
//optionItem按鈕事件
ActionListener optionListener = new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, “開啟選項");
}
};
//aboutItem按鈕事件
ActionListener aboutListener = new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, “SystemTray 系統匣\n\nTonyBox\n\nhttps://tonybox.wordpress.com");
}
};
//aboutItem按鈕事件
ActionListener exitListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, “離開");
System.out.println(“離開");
System.exit(0);
}
};
//加入事件
openItem.addActionListener(openListener);
optionItem.addActionListener(optionListener);
aboutItem.addActionListener(aboutListener);
exitItem.addActionListener(exitListener);
trayIcon.addMouseListener(mouseListener);
}
public static void main(String[] args) {
//Test
new SysTray();
}
}
近期迴響