MenuクラスとMenuItem クラスの2つと、それらのコンストラクタに指定するスタイルを組み合わせて使うことで、 バーとして表示したりポップアップとして表示したりと、いろいろな形のメニューを作成することが可能です。
Menuクラスには4つのコンストラクタが用意されています。 スタイルには、 SWT.BAR、SWT.DROP_DOWN、SWT.POPUPのうちいずれかと、 SWT.LEFT_TO_RIGHT、SWT.RIGHT_TO_LEFTのいずれかが指定できます。
Menu(Control parent) Menu(Decorations parent, int style) Menu(Menu parentMenu) Menu(MenuItem parentItem)
parent引数には、メニューがどこに属するのかを指定します。
ShellクラスはDecorationsクラスのサブクラスなので、Decorations型のparentには、Shellクラスのインスタンスを指定することができます。
parentMenu引数には、格納されるメニューを、parentItemには格納されるアイテムを指定します。
MenuItemクラスには2つのコンストラクタが用意されています。
MenuItem(Menu parent, int style) MenuItem(Menu parent, int style, int index)
parent引数は、作成されるMenuItemインスタンスがどのMenuに格納されるかを指定します。 style引数には、SWT.CHECK、SWT.CASCADE、SWT.PUSH、SWT.RADIO、 SWT.SEPARATORのいずれかが指定できます。 このうち、SWT.CASCADEは、さらにMenuインスタンスを格納することができます。 index引数は、格納されるメニューの何番目にこのアイテムが表示されるかを指定します。
基本的には、メニューにメニューアイテムを格納し、SWT.CASCADEスタイルのメニューアイテムにはさらにメニューを格納することができます。
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
public class SWTMenuBarDemonstrate {
public SWTMenuBarDemonstrate(Shell parent) {
Menu bar = new Menu(parent, SWT.BAR);
parent.setMenuBar(bar);
attachFileMenu(bar);
attachEditMenu(bar);
}
private void attachFileMenu(Menu parentMenu) {
MenuItem item = new MenuItem(parentMenu, SWT.CASCADE);
item.setText("&File");
Menu menu = new Menu(item);
item.setMenu(menu);
MenuItem itemSave = new MenuItem(menu, SWT.PUSH);
itemSave.setText("&save");
MenuItem itemLoad = new MenuItem(menu, SWT.PUSH);
itemLoad.setText("&load");
}
private void attachEditMenu(Menu parentMenu) {
MenuItem item = new MenuItem(parentMenu, SWT.CASCADE);
item.setText("&Edit");
Menu menu = new Menu(item);
item.setMenu(menu);
MenuItem itemCopy = new MenuItem(menu, SWT.PUSH);
itemCopy.setText("©");
MenuItem itemPaste = new MenuItem(menu, SWT.PUSH);
itemPaste.setText("&paste");
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
new SWTMenuBarDemonstrate(shell);
shell.setSize(100, 100);
shell.open();
while (!shell.isDisposed()) {
if (display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
メニューの中にさらにメニューを格納する場合は、いったんSWT.CASCADEスタイルのアイテムを作成して、
その子としてメニューを作成します。
さらに、メニューは、作成した後、setMenuBarメソッドやsetMenuメソッドによって明示的にセットする必要があります。
setTextメソッドによってテキストを設定する際、アンパサンド(&)を直前に置いた文字は、 Altキーを押した後に押すことで、そのアイテムが選択されます。 実行結果は、[Alt]→[F]とキーを押した結果です。
setTextで設定できるAltキーとアルファベットを組み合わせたショートカットキーの指定は便利ですが、 setAccelerator(int)メソッドを使用することで、Ctrlキーとアルファベットもしくは数字のショートカットキーを設定することも可能です。
MenuItemがクリックされたり、ショートカットキーが押下されたときのイベントは、 普通にリスナを登録することで可能です。 SWT.PUSHスタイルのメニューアイテムであれば、SelectionListenerでイベントをキャッチします。
MenuItem itemSave = new MenuItem(menu, SWT.PUSH);
itemSave.setText("&save");
itemSave.setAccelerator(SWT.CTRL + 's');
itemSave.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.out.println("save");
}
});
ポップアップメニューを作成するには、作成するMenuのコンストラクタに、SWT.POP_UPスタイルを指定します。 作成したポップアップスタイルのメニューは、setVisibleメソッドにtrueを指定して呼び出すことで出現します。 出現場所は、マウスポインタのある位置が考慮されます。
import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; public class PopupMenuDemonstrate extends Composite { public PopupMenuDemonstrate(Composite parent) { super(parent, SWT.NONE); setLayout(new FillLayout()); Display currDisplay = Display.getCurrent(); populateMenuPoppingComposite( this, "red", currDisplay.getSystemColor(SWT.COLOR_RED)); populateMenuPoppingComposite( this, "green", currDisplay.getSystemColor(SWT.COLOR_GREEN)); populateMenuPoppingComposite( this, "blue", currDisplay.getSystemColor(SWT.COLOR_BLUE)); setSize(400, 200); } /** * 引数nameはメニューアイテムに使われ、backgroundは作成されるCompositeの背景に使われる。 */ private void populateMenuPoppingComposite( Composite parent, String name, Color background) { Composite posi = new Composite(parent, SWT.NONE); posi.setBackground(background); // ポップアップメニューのスタイルはSWT.POP_UP final Menu popupMenu = new Menu(parent.getShell(), SWT.POP_UP); for (int i=0 ; i<3 ; i++) { MenuItem item1 = new MenuItem(popupMenu, SWT.PUSH); item1.setText(name + " item " + i); } posi.addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { // 左クリックが1、ホイルクリックが2、右クリックが3 if (e.button == 3) { popupMenu.setVisible(true); } } }); } public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); new CompositeMenuTest(shell); shell.pack(); shell.open(); while (!shell.isDisposed()) { if (display.readAndDispatch()) { display.sleep(); } } display.dispose(); } }
