ボタンがクリックされた、ウィンドウがリサイズされたなどのさまざまなイベントに処理を関連付けてプログラムを開発する方法を、イベントドリブン方式と呼びます。多くのGUIプログラミングでこの方式が採用されています。
SWTでは、イベントを待ち受けるイベントリスナーを実装し、そのイベントリスナーにイベント発生時に行う処理を記述します。
今回のサンプルアプリケーション開発では、「開く」ボタンが押されたというイベントに対して次の処理を実装します。
- ファイル選択ダイアログを開く
- ユーザーに選択されたファイル名をファイル名表示フィールドに表示する
- 写真イメージ描画キャンバスに表示する
表1:実装する処理
イベントを待ち受ける対象のウィジェットであるbtnOpenを右クリックし、メニューから「イベント → イベントの追加...」を選択すると、図1のイベント追加ダイアログが表示されます。左側のイベントツリーから「Selection → widgetSelected」を選択し、「終了」ボタンをクリックすると、イベントリスナーが自動生成されます。
図1:イベント追加ダイアログ (画像をクリックすると別ウィンドウに拡大図を表示します)
自動生成されたイベントリスナーにはSystem.out.println()文がスタブとして埋め込まれています。パッケージエクスプローラーでPhotoViewere.javaファイルを右クリックし、メニューから「実行 → Java bean」を選択して動作を確認してみましょう。
「開く」ボタンをクリックしたタイミングでコンソールに「widgetSelected()」という文字列が表示されることがわかるはずです。
リスト1に示すprivateフィールドを追加し、自動生成されたイベントリスナーの実装をリスト2のように修正してください(いくつかインポート宣言を追加する必要があるので、Eclipseが示唆するインポート文を追加してください)。
リスト1:追加するprivateフィールド
private Image photoImage = null;
リスト2:btnOpenのイベントリスナーの実装
btnOpen.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
FileDialog openDialog = new FileDialog(sShell,SWT.OPEN);
String file = openDialog.open();
if (file == null) {
return;
}
txtFilePath.setText(file);
photoImage = new Image(sShell.getDisplay(), file);
cvsPhoto.redraw();
}
});
また、cvsPhotoに「Paint → paintControl」のイベントリスナーを追加し、そのイベントリスナーをリスト3のように修正してください。
リスト3:cvsPhotoのイベントリスナーの実装
cvsPhoto.addPaintListener(new org.eclipse.swt.events.PaintListener() {
public void paintControl(org.eclipse.swt.events.PaintEvent e) {
if (photoImage != null) {
e.gc.drawImage(photoImage, 0, 0);
}
}
});
|