Swingも熟成が進み,様々な機能が使えるようになりました。パフォーマンスも初期のころに比べると各段の進歩をとげています。工夫次第では,昨年の9月の記事でご紹介したAerithのようにクールなユーザー・インタフェースを実現することもできます。

しかし,いまだに制約があることも確かです。その制約の一つがシステムトレイへのアクセスでした。

システムトレイは,Windowsのデスクトップの右下にある小さいアイコンが表示される領域です。

Java SE 6では,ようやくシステムトレイにアクセスできるようになりました。

システムトレイを表すクラスはjava.awt.SystemTrayクラスです。システムトレイ上に表示されるアイコンはjava.awt.TrayIconクラスで表されます。

アイコンの表示

まずはシステムトレイにアイコンを登録してみます。

サンプルはこちらからダウンロードできます:SystemTraySample1.java

以下にシステムトレイにアイコンを登録するコードを示します。

public SystemTraySample1() throws IOException, AWTException {
    // SystemTrayオブジェクトの取得
    SystemTray tray = SystemTray.getSystemTray();

    // アイコンの生成と登録
    TrayIcon icon = new TrayIcon(ImageIO.read(new File("duke-icon.png")));
    tray.add(icon);
}
アイコン画像(duke-icon.png)
図1 アイコン画像(duke-icon.png)
SystemTraySample1クラスの実行結果
図2 SystemTraySample1クラスの実行結果

SystemTrayオブジェクトはシングルトンであり,SystemTray#getSystemTrayメソッドで取得できます。

TrayIconクラスのコンストラクタは3種類あります。ここでは引数にImageオブジェクトを取るものを使用しました。

Windowsでは,システムトレイに表示するイメージはたて16ピクセル,よこ16ピクセルのサイズにします。また,アイコンのイメージは背景が透明のほうが見ばえがいいので,JPEGよりはPNGもしくはGIFを使いましょう。

ここで使用したduke-icon.pngを図1に示します。

TrayIconオブジェクトが生成できたら,SystemTrayオブジェクトにaddメソッドで登録します。

簡単ですね。SystemTraySample1クラスを実行すると図2のように表示されます。

アイコンのイベント

単にアイコンを表示するだけではつまらないので,イベント処理を付け加えてみましょう。

サンプルはこちらからダウンロードできます:SystemTraySample2.java

以下にアイコンに関連する部分を示します。

public SystemTraySample2() throws IOException, AWTException {
    // SystemTrayオブジェクトの取得
    SystemTray tray = SystemTray.getSystemTray();

    Image image = ImageIO.read(new File("duke-icon.png"));

    // 右クリック時に表示されるポップアップメニュー
    PopupMenu menu = new PopupMenu();
    menu.add(new MenuItem("Duke"));
    menu.add(new MenuItem("Fang"));

    // アイコンの生成
    // ツールチップとポップアップメニューを指定する
    icon = new TrayIcon(image, "I'm Duke!", menu);

    // マウス・イベント
    icon.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent event) {
            if (event.getButton() == MouseEvent.BUTTON1) {
                // ポップアップメッセージの表示
                icon.displayMessage("from Duke", "Hello, World!",
                                    TrayIcon.MessageType.INFO);
            }
        }
    });

    tray.add(icon);
}
ツールチップの表示
図3 ツールチップの表示
ポップアップメニューの表示
図4 ポップアップメニューの表示
ポップアップメッセージの表示
図5 ポップアップメッセージの表示

SystemTraySample2クラスでは,ポップアップメニュー,ツールチップ,マウス・イベントを扱います。ポップアップメニューはアイコンをマウスで右クリックしたときに表示されます。

ツールチップとポップアップメニューは,TrayIconクラスのコンストラクタの引数で指定します。第2引数がツールチップ,第3引数がポップアップメニューです。それぞれTrayIcon#setToolTipメソッド,TrayIcon#setPopupMenuメソッドで設定することも可能です。

TrayIconクラスはマウス・イベントも扱うことができます。イベントの処理はAWTのイベント処理と同じです。

ここでは左クリックされたときに,ポップアップメッセージを表示させてみました。ポップアップメッセージはTrayIcon#displayMessageメソッドで表示することができます。

さて,SystemTraySample2を実行してみましょう。図3にツールチップの表示,図4にポップアップメニューの表示,図5にポップアップメッセージの表示を示しました。ポップアップメニューはSwingのJPopupMenuクラスが使用できないので外観はいまいちですが,機能的には十分です。

ここでは行いませんでしたが,状況に応じてイメージを変更することも可能です。システムトレイは,常駐アプリケーションの状態表示などいろいろな使い道がありそうですね。

著者紹介 櫻庭祐一

横河電機 ネットワーク開発センタ所属。Java in the Box 主筆

今月の櫻庭

櫻庭にとって例年,1月から2月にかけて散財の日々が続きます。というのも,この季節はショコラティエ(チョコレート職人)が腕によりをかけたチョコレートが巷をにぎわすからであります。また,チョコレートを食べるのには冬の室温ぐらいがちょうどいいのです。

もちろん,当然のごとく自分買いです。

今年の目玉はフランス以外に出展するのは初というベルナシオン。また,時期的にはちょっと先になりますがノカチョコレートも気になる存在であります。もちろん,既存のショコラティエも忘れるわけにはいきません。

というわけで,財布はやせ細り,体重だけは増え続けるという日々を過ごすわけであります。