Javaでかんたんタスクトレイ常駐アプリ

Javaで常駐アプリ

最近ちょっとJavaで常駐アプリを作ったので
そのことについて書きます。
Java in the BoxJava SE 6 じゃじゃ馬ならし TrayIcon
を大いに参考にさせてもらいました。


今までJavaで常駐アプリを作るのはちょっと抵抗がありました。
というのは、黒いDOS窓が残ったりしてださかったり、
Windowsサービスに登録できるようにするのがめんどくさかったりしたからです。


しかし、Java SE6からタスクトレイが使えるようになったので、
すごく敷居が下がりました。

いちばん簡単な例

これだけのコード量でタスクトレイに常駐するアプリケーションが作れます。
まあ、本当に常駐しているだけなんですが。

Sample.java
import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;

public class Sample {
    public static void main(String[] args) throws Exception {
        // アイコンイメージの読み込み
        Image image = ImageIO.read(Thread.currentThread()
                .getContextClassLoader()
                .getResourceAsStream("trayicon.png"));
        // トレイアイコン生成
        TrayIcon icon = new TrayIcon(image);
        // イベント登録
        icon.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        SystemTray.getSystemTray().add(icon);
    }
}
見た目

こんな感じで常駐しています。

もうちょっといろいろできる例

他にもメニューを付けたり、一定間隔で処理したりできます。

タイマー

java.util.Timerを使って一定間隔毎にメッセージを表示しています。

メニュー

メニューも選択できます。


メニュー選択時やアイコンクリック時の処理も
登録しておけばなんでもできます。
(ここではメッセージ表示)



ソースコード

ソースを以下に示します。
具体的な処理を書き込めるテンプレ風のサンプルです。

TaskTraySample.java
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;

/**
 * タスクトレイ常駐アプリサンプル
 */
public class TaskTraySample {

    /** コンストラクタ */
    public TaskTraySample() throws IOException, AWTException {

        // タスクトレイアイコン
        Image image = ImageIO.read(
                getClass().getResourceAsStream("trayicon.png"));
        final TrayIcon icon = new TrayIcon(image);
        icon.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                icon.displayMessage("アイコンクリック",
                    "アイコンがダブルクリックされました",
                    MessageType.WARNING);
            }
        });
        
        // ポップアップメニュー
        PopupMenu menu = new PopupMenu();
        // メニューの例
        MenuItem aItem = new MenuItem("メニューの例");
        aItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                icon.displayMessage("メニューの例",
                        "メニューが選択されました",
                        MessageType.ERROR);
            }
        });
        // 終了メニュー
        MenuItem exitItem = new MenuItem("終了");
        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        // メニューにメニューアイテムを追加
        menu.add(aItem);
        menu.add(exitItem);
        icon.setPopupMenu(menu);
        
        // タスクトレイに格納
        SystemTray.getSystemTray().add(icon);

        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                icon.displayMessage("タイマー",
                        "タイマータスクです。", MessageType.INFO);
            }
        };
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(task, 0, 1 * 60 * 1000); // 1分ごと
    }

    /** メインメソッド */ 
    public static void main(String[] args) throws Exception {
        new TaskTraySample();
    }
}

おしまい

Javaが得意な人は多いと思うので、得意な言語でちょっとした
デスクトップアプリが作れるっていうのは良いことだと思います。
まあ、Javaメインやってると、「Windowsアプリ作りたいけどC#覚えるのもなんだかなあ」
ってことありますんで。