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 を使用し以下の機能を実装します。
- 起動するとタスクトレイにアイコンを表示。
- 【点滅ボタン】をクリックすると、タスクトレイのアイコンを点滅させる。
またバルーンにて「ここから出してくれ!!」のメッセージを表示。 - 【解除ボタン】をクリックすると、アイコン点滅を解除する。
- タスクトレイのアイコンを左シングルクリックで、メインウィンドウをデスクトップ上に取り出す。
- タスクトレイのアイコンを右クリックでデフォルトの PopupMenu メニューを表示。
- メインウィンドウが最小化されたらタスクトレイに格納。
ソースコード取得
ソースコードは以下から取得可能です。またコンパイルする場合は、ソースコトードと同じ場所に以下のアイコンも保存してください。
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import 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 {
private static JFrame frame;
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) {
try {
// LookAndFeelをWindowsに設定
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName());
// 通常のアイコン
final Image img = new ImageIcon(
TaskTrayUtil.class.getResource(
“tray_icon.gif”)).getImage();
final JFrame frame =
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));
// 点滅アイコン
final Image 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) {
replaceImageWithDelete(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();
}
}
/**
*
*/
static {
createPopupMenu();
}
/**
* タスクトレイに表示するデフォルトのPopupMenuメニューを生成します。
* 以下のメニューがあります。
* ・「タスクトレイから取り出す」
* タスクトレイから対象のアプリケーションをデスクトップ上に
* 取り出します。
* (ウィンドウをアクティブにし、手前に表示する。)
* ・終了対象のアプリケーションを終了させます。
*/
private static void createPopupMenu() {
MenuItem getTrayItem = new MenuItem(“タスクトレイから取り出す”);
getTrayItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
active();
}
});
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) {
createTray(targetFrame, null, null);
}
/**
* トレイアイコンを作成し、システムトレイに追加する。
*
* @param targetFrame 対象のアプリケーション
* @param image トレイアイコンに表示するイメージ画像。
* nullの場合、targetFrame からgetIconImage()で取得できる
* イメージ画像を使用します。
* @param menu タスクトレイに表示するPopupMenu。
* nullの場合、デフォルトのPopupMenuを表示します。
*/
public static void createTray(final JFrame targetFrame, Image image,
PopupMenu menu) {
// システム・トレイがサポートされていなければ終了。
if (!SystemTray.isSupported()) {
return;
}
TaskTrayUtil.frame = targetFrame;
if (image == null) {
image = targetFrame.getIconImage();
}
if (menu == null) {
menu = defaultMenu;
}
trayIcon = new TrayIcon(image, targetFrame.getTitle(), menu);
trayIcon.setImageAutoSize(true);
trayIcon.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
active();
}
}
});
try {
tray.add(trayIcon);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
/**
* タスクトレイからアイコンを削除する。
* アプリケーション終了時に呼び出す必要がある。
*/
public static void removeTrayIcon() {
tray.remove(trayIcon);
}
/**
* タスクトレイのアイコンを点滅させる。
* @param msg 必要であれば点滅されたアイコンがクリックされた時に
* 表示するメッセージをセットします。
*/
public static void onAndOffLight(Image lightImg, String msg) {
replaceImage(lightImg);
ChangeLightImgAdapter adap =
new TaskTrayUtil().new ChangeLightImgAdapter(msg);
trayIcon.addMouseListener(adap);
frame.addWindowListener(adap);
}
/**
* タスクトレイのアイコンを変更する。
* @param image 現在のアイコンと違う場合のみ変更する。
*/
public static void replaceImage(Image image) {
synchronized (INSTANCE_LOCK) {
if (!image.equals(trayIcon.getImage())) {
trayIcon.setImage(image);
}
}
}
/**
* タスクトレイのアイコンを変更する。
* ※何故か点滅しているアイコンを戻す場合は、
* {@link SystemTray#remove(TrayIcon)})で削除しないと 駄目なようである。
* @param image 現在のアイコンと違う場合のみ変更する。
*/
public static void replaceImageWithDelete(Image image) {
synchronized (INSTANCE_LOCK) {
if (!image.equals(trayIcon.getImage())) {
tray.remove(trayIcon);
trayIcon.setImage(image);
try {
tray.add(trayIcon);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* タスクトレイにポップアップ・メッセージを表示させます。
* @param caption
* @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);
}
/**
* 点滅されたアイコンがクリックされた時に、発生させるイベント
* Listenerクラス。
*/
class ChangeLightImgAdapter implements WindowListener, MouseListener {
String 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) {}
}
}