メニューとアクション

JFace/SWTのメニューはSwing/AWTのものと比べると、少しだけシンプルな構造になっているのではないかと思います。

ウィンドウの上端の「ファイル(F)」やら「編集(E)」やらが並んでいる部分、すなわちメニューバーの部分を表示するには、ApplicationWindow#createMenuManager()をオーバーライドしてメニューバーの本体であるorg.eclipse.jface.action.MenuManagerオブジェクトを作成しておき、ApplicationWindow#addMenuBar()を呼び出します。

MenuManagerオブジェクトの作り方は単純で、newするだけです。また「ファイル(F)」やら「編集(E)」やらの部分も同じMenuManagerオブジェクトで実現されます。

	// メニューバーを作成する。
	MenuManager bar = new MenuManager();

	// ファイル(F)メニューを作成してメニューバーに追加する。
	MenuManager fileMenu = new MenuManager("ファイル(&F)");
	bar.add(fileMenu);

Fの前に&をつけることで、Fがニーモニックと認識され、表示上はFの下にアンダースコアが付きます。そしてAlt-Fでファイルメニューが表示されるようになります。

「ファイル(F)」メニューを選んだときに表示される「開く(O)」や「終了(Q)」といった個々のメニュー項目は、org.eclipse.jface.action.Actionのサブクラスを作成するのが便利です。Actionはメニューの項目だけでなく、ツールバーの項目やボタンにつけることもできます。例えばウィンドウを閉じてプログラムを終了させるActionであるExitActionであれば次のようにします。

import org.eclipse.jface.action.Action;
import org.eclipse.jface.window.ApplicationWindow;

/*
 * 終了アクション
 */
public class ExitAction extends Action {

	private ApplicationWindow window = null;

	/**
	 * コンストラクタ
	 * @param window 親ウィンドウ
	 */
	public ExitAction(ApplicationWindow window) {
		this.window = window;
		setText("終了(&X)@Ctrl+W");
	}

	/**
	 * アクションの実行
	 */
	public void run() {
		this.window.close();
	}
}

Action#setText()を呼び出して表示する文字列を指定します。Xの前に&があるのはMenuManagerの場合と同じです。@に続いてCtrl+Wとあるのはキーアクセラレータの指定です。Ctrl+Wでこのアクションが実行されます。

このExitActionをファイルメニューに追加するには対応するMenuManagerに追加するだけです。

	fileMenu.add(new ExitAction(window));

ここでwindowはApplicationWindowのサブクラスのインスタンスです。


SWT, JFace  ソフトウェア研究室  PoisonSoft