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

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

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

タスクトレイにアイコンを表示するTrayとTrayItem
まずは、タスクトレイにアイコンを表示するために使用する、TrayとTrayItemの使い方を見ておきましょう。
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)によって、見慣れた「情報」アイコン
を取得することができます。これをそのままTrayItemにsetImage(Image)メソッドで設定します。
Imageもアプリケーションで必要なくなったらdispose()メソッドを呼び出してリソースを解放しなければいけませんが、本文で使用しているシステムイメージはシステムによって管理されているため、解放する必要はありません。InputStream is = this.getClass().getResourceAsStream("/something.png"); Image image = new Image(display, is); ...
ImageはTrayItemが破棄されるときに、それ以降必要がなければ(プログラムの他の場所で共有していなければ)、破棄する必要があります。item.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { image.dispose(); } });
TrayItemのDisposeListenerにImage#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を表示できるようにしましょう。

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つだけ指定できます。
| スタイル定数 | 説明 |
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.BALLOONとSWT.ICON_INFORMATIONの間にパイプ(|)をはさまれたものが指定されています。このパイプはビット和演算子で、SWT.BALLOONとSWT.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が表示されます。

