SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

タスクトレイにアイコンとバルーンを表示する(Java SWT編)

JavaでもできるタスクトレイアイコンとバルーンTips

Visual Editorでの編集

 では、VisualEditorで編集を始めましょう。まずはウィンドウに表示されるタイトルを「Shell」から「タスクトレイアイコンとバルーンTips」に変更します。タイトルバーの左上をクリックすると変更できます。

 次にShellのサイズを変更します。下辺のハンドルをドラッグして高さを小さくしてください。サイズを数値で指定したい場合は、Propertiesビューで[size]をクリックして数値を入力してください。

プログラムの実行

 修正したプログラムを実行してみましょう。「MainWindow.java」のエディタを表示させた状態で、[Run]-[Run As]-[Java Application]を選択します([SWT Application]でも良い)。実行できることを確認できたら[閉じる]ボタンで終了します。

タスクトレイにアイコンを表示するTrayとTrayItem

 まずは、タスクトレイにアイコンを表示するために使用する、TrayTrayItemの使い方を見ておきましょう。

Display display = Display.getDefault();
Tray tray = display.getSystemTray();
if (tray == null)
    return;
TrayItem item = new TrayItem(tray, SWT.NONE);

 TrayクラスはDisplayオブジェクトから取得できるようになっており、DisplayオブジェクトはDisplay自身のstaticメソッドであるDisplay.getDefault()で取得することができます。TrayItemはコンストラクタの第1引数にTrayオブジェクト、第2引数にSWT特有のスタイル定数を指定します。TrayItemには設定できるスタイルがないのでSWT.NONEを指定しています。

 また、display.getSystemTray()の戻り値は、プログラムを実行しているOSがタスクトレイをサポートしていない場合にnullを返す仕様になっています。Windowsでは通常、nullが返ってくることはありませんが、SWTはクロスプラットフォームであるため、タスクトレイをサポートしていないOSも想定するようにします。

 アイコンを指定するにはTrayItem#setImage(Image)を呼び出さなければいけないので、先にImageを取得しておきます。ここでは説明を簡潔にするために、OSが用意しているシステムイメージを取得して設定します。

Image image = display.getSystemImage(SWT.ICON_INFORMATION);
item.setImage(image);

 display.getSystemImage(SWT.ICON_INFORMATION)によって、見慣れた「情報」アイコンを取得することができます。これをそのままTrayItemsetImage(Image)メソッドで設定します。

SWTではリソースの解放が必要
 SWTはJNI(Java Native Interface)を使用しているため、通常のJavaアプリケーションとは異なり、リソースの明示的な解放が必要です。通常はImageもアプリケーションで必要なくなったらdispose()メソッドを呼び出してリソースを解放しなければいけませんが、本文で使用しているシステムイメージはシステムによって管理されているため、解放する必要はありません。
InputStream is = this.getClass().getResourceAsStream("/something.png");
Image image = new Image(display, is);
...
 このようにしてアプリケーションで生成したImageTrayItemが破棄されるときに、それ以降必要がなければ(プログラムの他の場所で共有していなければ)、破棄する必要があります。
item.addDisposeListener(new DisposeListener() {
    public void widgetDisposed(DisposeEvent e) {
        image.dispose();
    }
});
 このようにTrayItemDisposeListenerImage#dispose()メソッドを呼び出す処理を記述しておけば、TrayItemが破棄される際に確実に解放されます。
 なお、この場合、imageは匿名インナークラスから参照できるようにfinal変数にする必要がある旨のエラーが出ます。Eclipseの提案に従ってfinal変数にしても良いですし、匿名インナークラスではなく通常のインナークラスを用いてコンストラクタでimageを渡すようにしたり、imageをフィールド変数にすることで参照できるようにする方法もあります。

タスクトレイアイコンの処理を追加する

 ここからソースコードを編集していきます。先ほどVisual Editorで編集した結果、Shellを生成するメソッドが作られています。

private void createSShell() {
    sShell = new Shell();
    sShell.setText("タスクトレイとバルーンTips");
    sShell.setSize(new Point(300, 75));
    sShell.setLayout(new GridLayout());
}

 次のように処理を追加します。

private void createSShell() {
    sShell = new Shell();
    sShell.setText("タスクトレイとバルーンTips");
    sShell.setSize(new Point(300, 75));
    sShell.setLayout(new GridLayout());
    
    createTrayAndBalloon();
}

private void createTrayAndBalloon() {
    // タスクトレイアイコンの表示
    Display display = Display.getDefault();
    Tray tray = display.getSystemTray();
    if (tray == unll)
        return;
    TrayItem item = new TrayItem(tray, SWT.NONE);
    Image image = display.getSystemImage(SWT.ICON_INFORMATION);
    item.setImage(image);
    
    // バルーンTipsの表示
}

 Imageにエラーが出るので、[Shift]+[Control]+[O(オー)]キーでimportの再編成を行います。また、AWTに同じ名前のクラスが存在するので、誤って選択しないように注意してください。org.eclipseで始まるクラスを選択します。

 これでタスクトレイにアイコンが表示されるようになりました。

タスクトレイに表示された「情報」アイコン
タスクトレイに表示された「情報」アイコン

バルーンTipsを表示するToolTip

 続いて、ToolTipクラスを使ってバルーンTipsを表示できるようにしましょう。

バルーンTips
バルーンTips

 ToolTipクラスはコンストラクタの第1引数にShellオブジェクト、第2引数にTrayItemでも登場したスタイル定数を指定します。

ToolTip tip = new ToolTip(sShell, SWT.BALLOON | SWT.ICON_INFORMATION);
tip.setText("タイトル");
tip.setMessage("ユーザーに通知するメッセージを設定します。");
item.setToolTip(tip);
tip.setVisible(true);

 第2引数は次のようなスタイルを設定できます。ICONで始まるスタイルはいずれか1つだけ指定できます。

第2引数のスタイル定数
スタイル定数説明
SWT.BALLOONウィンドウをバルーン型にするかどうか
SWT.ICON_ERRORエラーアイコン
SWT.ICON_INFORMATION情報アイコン
SWT.ICON_WARNING警告アイコン

 ToolTip#setText(String)メソッドはタイトルを指定します。ToolTip#setMessage(String)メソッドは通知の内容を指定します。TrayItem#setToolTip(ToolTip)メソッドはタスクトレイアイコンにバルーンTipsを関連付けます。ToolTip#setVisible(boolean)メソッドは表示・非表示を指定します。

 なお、TrayItem#setToolTip(ToolTip)メソッドを呼び出さずにToolTipを単独で使用することも可能で、その場合はToolTipクラスのsetLocation(int, int)メソッドまたは引数が異なるsetLocation(Point)メソッドで画面上の位置を指定して表示させることができます。

スタイル定数
 上記のソースコードでは、ToolTipのスタイル定数はSWT.NONEではなく、SWT.BALLOONSWT.ICON_INFORMATIONの間にパイプ(|)をはさまれたものが指定されています。このパイプはビット和演算子で、SWT.BALLOONSWT.ICON_INFORMATIONのどちらかのビットが1であれば結果も1になるという演算が行われるのですが、ここでは文法として覚えておけば問題ありません。また、ToolTipでは使いませんが、SWT.YES | SWT.NO | SWT.CANCELのように3つ以上つなげることもできます。

バルーンTipsの処理を記述する

 createTrayAndBalloon()メソッドに処理を追加します。

private void createTrayAndBalloon() {
    // タスクトレイアイコンの表示
    Display display = Display.getDefault();
    Tray tray = display.getSystemTray();
    if (tray == unll)
        return;
    TrayItem item = new TrayItem(tray, SWT.NONE);
    Image image = display.getSystemImage(SWT.ICON_INFORMATION);
    item.setImage(image);
    
    // バルーンTipsの表示
    ToolTip tip = new ToolTip(sShell, SWT.BALLOON | SWT.ICON_INFORMATION);
    tip.setText("バルーンTipsの表示");
    tip.setMessage("SWTを使うことによってJavaでもネイティブアプリケーションと"
            + "遜色のないユーザーエクスペリエンスを実現できます。");
    item.setToolTip(tip);
    tip.setVisible(true);
}

 これでcreateTrayAndBalloon()メソッドは完成です。アプリケーションを起動するとタスクトレイアイコンとバルーンTipsが表示されます。

次のページ
タスクトレイアイコン本来の使い方

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

Takayuki(タカユキ)

ブログPeta Walkers(自作ソフトウェアの紹介)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/463 2006/08/08 12:01

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー