目次
はじめに
今回から2回に渡って、グラフィカルなプラグインを作成するときに必要となるStandard Widget Toolkit(以降、SWT)とJFaceのGUIコンポーネントについて説明します。
SWTの大きな特徴は、OSネイティブに実装されているため動作が高速という点です。高速な動作を実現するためにマルチプラットフォームというJavaの思想から外れているため、一時期は一部のエンジニアから非難の声も聞こえていましたが、Eclipseの広まりと共にそのような声もなくなってきました。
JFaceはSWTの利用を補助するフレームワークで、内部的にSWTのコンポーネントを利用しています。
ここではGUIコンポーネントを中心に説明し、SWTのレイアウトマネージャについて説明しません。好みの問題もありますが、レイアウトマネージャを使用するとソースの可読性が落ちてしまうため、筆者がプラグインを作成するときはどうしても必要な場合を除き、レイアウトマネージャは使用せずに座標指 定でGUIコンポーネントを配置するようにしています。
今回はSWTで提供されているコンポーネントを使用して、グラフィカルなプラグインを作成するときの基本から便利なテクニックについて説明します。
なおSWT/JFaceのAPIドキュメントは、Eclipseをインストールしたディレクトリのplugins /org.eclipse.platform.doc.isv_*/doc.zipを展開し、reference/apiから参照するか、またはヘルプの 「Platform プラグイン・デベロッパー・ガイド」から参照できます。ここで紹介する以外のコンポーネントや利用方法については、そちらを参照してください。
![]()
SWT/JFaceでは、OSのリソースを使用してフォントやイメージ、カラーを割り当てているため、そのままではガベージコレクションの対象にならず、使用したリソースは、disposeメソッドを使用して明示的に開放する必要があります。
JFaceでは、これらの煩雑になりがちなリソースの開放処理を補助するために、フォントには org.eclipse.jface.resource.FontRegistryクラス、イメージには org.eclipse.jface.resource.ImageRegistryクラス、カラーには org.eclipse.jface.resource.ColorRegistryクラスといったクラスが用意されています。
各Registryクラスを使用する場合には、使用するリソースとキーワードをputメソッドであらかじめ設定しておき、使用するときに Registryクラスからgetメソッドでリソースを取得して使用します。Registryクラスに登録されたリソースは org.eclipse.swt.widgets.Displayクラスのdisposeメソッドが呼ばれたタイミング(アプリケーションの終了時)に自 動的に開放されるため、リソースの開放を意識する必要がなくなります。
ただしアプリケーションの動作中はリソースが確保されたままになるため、一時的に使用するリソースについては、Registryクラスを使用しない方が良い場合もあります。
GUIコンポーネント
Swingの使用経験がある方は違和感を持つと思いますが、SWTでGUIコンポーネントを作成する場合は、インスタンスを生成するときに親のコンポジットとスタイルを指定します。またスタイルの指定を変えることで、たとえばButtonクラスからチェックボックスやラジオボタン、トグルボタンといった様々なボタンを生成し、コンポーネントの振る舞いを変えることができます。
作成したGUIコンポーネントにアクションを設定する場合は、Swingの場合と同様にリスナーを作成して、コンポーネントに追加します。たとえば ボタンをクリックしたときのアクションを設定する場合には、以下のリストのように org.eclipse.swt.events.SelectionListenerインターフェイスをインプリメントした ButtonActionAdapterクラスを作成し、addSelectionListener(new ButtonActionAdapter());でリスナを追加します。
またSWTではインターフェイスとしてのリスナーだけでなく、リスナーのメソッドを空で実装したアダプタクラスも用意されています。アダプタクラス を継承することですべてのメソッドをオーバーライドする必要がなくなり、ソースコード上に不要なメソッドの記述が現れることを防ぐことができます。
⁄**
* ボタンクリック時のアクションクラス(リスナー利用の場合)
*⁄
class ButtonActionAdapter implements SelectionListener {
public void widgetSelected(SelectionEvent e) {
Button source = (Button)e.getSource();
source.setText("Clicked");
}
public void widgetDefaultSelected(SelectionEvent e) {
}
} ![]()
⁄**
* ボタンクリック時のアクションクラス(アダプタ利用の場合)
*⁄
class ButtonActionAdapter extends SelectionAdapter {
⁄⁄ 必要なメソッドのみ記述
public void widgetSelected(SelectionEvent e) {
Button source = (Button)e.getSource();
source.setText("Clicked");
}
} それでは、SWTで提供されている代表的なGUIコンポーネントとその利用方法について見ていきましょう。
ラベル(Label)
SWTのorg.eclipse.swt.widgets.Labelクラスは、SwingのJLabelに対応します。スタイルを変更することで、以下のような様々な種類のラベルを作成できます。
テキストラベル
Label textLabel = new Label(parent, SWT.BORDER | SWT.CENTER);
textLabel.setText("TextLabel");
textLabel.setBounds(x, y, width, height);
垂直セパレータラベル
Label verticalSeparatorLabel = new Label(parent, SWT.VERTICAL | SWT.SEPARATOR);
verticalSeparatorLabel.setBounds(x, y, width, height);
水平セパレータラベル
Label horizontalSeparatorLabel = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR);
horizontalSeparatorLabel.setBounds( x, y, width, height);