Posts Tagged 'TrayIcon'

SystemTray – 常駐程式

systemtray.gif

(圖片來源: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 – 錯誤訊息error.png
  • TrayIcon.MessageType.INFO – 資訊訊息info.png
  • TrayIcon.MessageType.NONE – 簡單訊息(無圖示)
  • TrayIcon.MessageType.WARNING – 警告訊息warning.png

註: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();
}

}