在 Java SWT 教程的这一部分中,我们使用菜单和工具栏。
菜单栏是 GUI 应用的常见部分。 它是位于各个菜单中的一组命令。
简单菜单
在第一个示例中,我们创建一个带有一个文件菜单的菜单栏。 该菜单只有一个菜单项。 通过选择项目,应用结束。
SimpleMenuEx.java
package com.zetcode;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;/*** ZetCode Java SWT tutorial** This program creates a simple menu.** Author: Jan Bodnar* Website: zetcode.com* Last modified: June 2015*/public class SimpleMenuEx {public SimpleMenuEx(Display display) {initUI(display);}private void initUI(Display display) {Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);Menu menuBar = new Menu(shell, SWT.BAR);MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeFileMenu.setText("&File");Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);cascadeFileMenu.setMenu(fileMenu);MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);exitItem.setText("&Exit");shell.setMenuBar(menuBar);exitItem.addListener(SWT.Selection, event-> {shell.getDisplay().dispose();System.exit(0);});shell.setText("Simple menu");shell.setSize(300, 200);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}@SuppressWarnings("unused")public static void main(String[] args) {Display display = new Display();SimpleMenuEx ex = new SimpleMenuEx(display);display.dispose();}}
这是一个最小的菜单栏功能示例。
Menu menuBar = new Menu(shell, SWT.BAR);
将SWT.BAR选项传递给Menu将创建一个菜单栏。
MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeFileMenu.setText("&File");
顶级菜单项是级联菜单项。 他们收到SWT.CASCADE选项。
Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);cascadeFileMenu.setMenu(fileMenu);
下拉菜单是使用SWT.DROP_DOWN选项创建的。
MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);exitItem.setText("&Exit");
推菜单项已插入下拉菜单中。 它是使用SWT.PUSH选项创建的。
shell.setMenuBar(menuBar);
setMenuBar()在外壳上设置菜单栏。
exitItem.addListener(SWT.Selection, event-> {shell.getDisplay().dispose();System.exit(0);});
当我们选择退出推送菜单项时,应用终止。

图:简单菜单
子菜单
下一个示例演示如何创建子菜单。
SubMenuEx.java
package com.zetcode;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;/*** ZetCode Java SWT tutorial** This program creates a submenu.** Author: Jan Bodnar* Website: zetcode.com* Last modified: June 2015*/public class SubMenuEx {public SubMenuEx(Display display) {initUI(display);}private void initUI(Display display) {Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);Menu menuBar = new Menu(shell, SWT.BAR);MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeFileMenu.setText("&File");Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);cascadeFileMenu.setMenu(fileMenu);MenuItem cascadeEditMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeEditMenu.setText("&Edit");MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);subMenuItem.setText("Import");Menu submenu = new Menu(shell, SWT.DROP_DOWN);subMenuItem.setMenu(submenu);MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);feedItem.setText("&Import news feed...");MenuItem bmarks = new MenuItem(submenu, SWT.PUSH);bmarks.setText("&Import bookmarks...");MenuItem mailItem = new MenuItem(submenu, SWT.PUSH);mailItem.setText("&Import mail...");MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);exitItem.setText("&Exit");shell.setMenuBar(menuBar);exitItem.addListener(SWT.Selection, event-> {shell.getDisplay().dispose();System.exit(0);});shell.setText("Submenu");shell.setSize(300, 250);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}@SuppressWarnings("unused")public static void main(String[] args) {Display display = new Display();SubMenuEx ex = new SubMenuEx(display);display.dispose();}}
该示例在另一个菜单内创建一个菜单。
MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);subMenuItem.setText("Import");
子菜单的创建类似于创建普通菜单。 首先,我们创建一个层叠菜单项。 唯一的区别是父窗口小部件。 这次,父级是子菜单所属的菜单对象。
MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);feedItem.setText("&Import news feed...");
我们创建一个推菜单项。 父窗口小部件是子菜单对象。

图:子菜单
CheckMenuItem
CheckMenuItem是带有复选框的菜单项。 它可以用于布尔属性。
CheckMenuItemEx.java
package com.zetcode;import org.eclipse.swt.SWT;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.layout.FormAttachment;import org.eclipse.swt.layout.FormData;import org.eclipse.swt.layout.FormLayout;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.MenuItem;import org.eclipse.swt.widgets.Shell;/*** ZetCode Java SWT tutorial** This program creates a check menu item.* It will show or hide a statusbar.** Author: Jan Bodnar* Website: zetcode.com* Last modified: June 2015*/public class CheckMenuItemEx {private Shell shell;private Label status;private MenuItem statItem;public CheckMenuItemEx(Display display) {initUI(display);}public void initUI(Display display) {shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);Menu menuBar = new Menu(shell, SWT.BAR);shell.setMenuBar(menuBar);MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeFileMenu.setText("&File");Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);cascadeFileMenu.setMenu(fileMenu);MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);exitItem.setText("&Exit");MenuItem cascadeViewMenu = new MenuItem(menuBar, SWT.CASCADE);cascadeViewMenu.setText("&View");Menu viewMenu = new Menu(shell, SWT.DROP_DOWN);cascadeViewMenu.setMenu(viewMenu);statItem = new MenuItem(viewMenu, SWT.CHECK);statItem.setSelection(true);statItem.setText("&View Statusbar");statItem.addListener(SWT.Selection, new MyStatusListener());exitItem.addSelectionListener(new MySelectionAdapter());status = new Label(shell, SWT.BORDER);status.setText("Ready");FormLayout layout = new FormLayout();shell.setLayout(layout);FormData labelData = new FormData();labelData.left = new FormAttachment(0);labelData.right = new FormAttachment(100);labelData.bottom = new FormAttachment(100);status.setLayoutData(labelData);shell.setText("Check menu item");shell.setSize(300, 250);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}private class MyStatusListener implements Listener {@Overridepublic void handleEvent(Event event) {if (statItem.getSelection()) {status.setVisible(true);} else {status.setVisible(false);}}}private class MySelectionAdapter extends SelectionAdapter {@Overridepublic void widgetSelected(SelectionEvent e) {shell.getDisplay().dispose();System.exit(0);}}@SuppressWarnings("unused")public static void main(String[] args) {Display display = new Display();CheckMenuItemEx ex = new CheckMenuItemEx(display);display.dispose();}}
在我们的代码示例中,我们显示一个检查菜单项。 如果该复选框已激活,则会显示状态栏。 如果不是,状态栏将被隐藏。
statItem = new MenuItem(viewMenu, SWT.CHECK);
SWT.CHECK标志将创建一个检查菜单项。
statItem.setSelection(true);
setSelection()方法选中或取消选中检查菜单项。
if (statItem.getSelection()) {status.setVisible(true);} else {status.setVisible(false);}
根据检查菜单项的状态,我们显示或隐藏标签小部件。

图:选中菜单项
弹出菜单
在下一个示例中,我们创建一个弹出菜单。 弹出菜单也称为上下文菜单。 当我们右键单击一个对象时,将显示此类型的菜单。
PopupMenuEx.java
package com.zetcode;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;/*** ZetCode Java SWT tutorial** This program creates a popup menu.** Author: Jan Bodnar* Website: zetcode.com* Last modified: June 2015*/public class PopupMenuEx {public PopupMenuEx(Display display) {initUI(display);}private void initUI(Display display) {Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);Menu menu = new Menu(shell, SWT.POP_UP);MenuItem minItem = new MenuItem(menu, SWT.PUSH);minItem.setText("Minimize");minItem.addListener(SWT.Selection, event -> {shell.setMinimized(true);});MenuItem exitItem = new MenuItem(menu, SWT.PUSH);exitItem.setText("Exit");exitItem.addListener(SWT.Selection, event -> {shell.getDisplay().dispose();System.exit(0);});shell.setText("Popup menu");shell.setMenu(menu);shell.setSize(300, 250);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}@SuppressWarnings("unused")public static void main(String[] args) {Display display = new Display();PopupMenuEx ex = new PopupMenuEx(display);display.dispose();}}
在我们的代码示例中,我们创建一个带有两个菜单项的弹出菜单。 第一个最小化窗口,第二个终止应用。
Menu menu = new Menu(shell, SWT.POP_UP);
使用SWT.POP_UP标志创建弹出菜单。
MenuItem minItem = new MenuItem(menu, SWT.PUSH);minItem.setText("Minimize");
弹出菜单中的菜单项是普通的推菜单项。
minItem.addListener(SWT.Selection, event -> {shell.setMinimized(true);});
setMinimized()方法将窗口最小化。
shell.setMenu(menu);
我们为外壳设置一个弹出菜单。

图:弹出菜单
简单的工具栏
菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。 在下面的示例中,我们创建一个简单的工具栏。
SimpleToolBarEx.java
package com.zetcode;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Device;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.widgets.ToolBar;import org.eclipse.swt.widgets.ToolItem;/*** ZetCode Java SWT tutorial** This program creates a simple toolbar.** Author: Jan Bodnar* Website: zetcode.com* Last modified: June 2015*/public class SimpleToolBarEx {private Image newi;private Image opei;private Image quii;public SimpleToolBarEx(Display display) {initUI(display);}@SuppressWarnings("unused")public void initUI(Display display) {Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);Device dev = shell.getDisplay();try {newi = new Image(dev, "new.png");opei = new Image(dev, "open.png");quii = new Image(dev, "quit.png");} catch (Exception e) {System.out.println("Cannot load images");System.out.println(e.getMessage());System.exit(1);}ToolBar toolBar = new ToolBar(shell, SWT.BORDER);ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);item1.setImage(newi);ToolItem item2 = new ToolItem(toolBar, SWT.PUSH);item2.setImage(opei);ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);ToolItem item3 = new ToolItem(toolBar, SWT.PUSH);item3.setImage(quii);toolBar.pack();item3.addListener(SWT.Selection, event -> {shell.getDisplay().dispose();System.exit(0);});shell.setText("Simple toolbar");shell.setSize(300, 250);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}@Overridepublic void finalize() {newi.dispose();opei.dispose();quii.dispose();}public static void main(String[] args) {Display display = new Display();SimpleToolBarEx ex = new SimpleToolBarEx(display);ex.finalize();display.dispose();}}
该示例显示了一个工具栏和三个工具项。
ToolBar toolBar = new ToolBar(shell, SWT.BORDER);
工具栏已创建。
ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);item1.setImage(newi);
我们创建一个带有图像的工具项。
ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);
在这里,我们创建一个垂直分隔符。

图:工具栏
在 Java SWT 教程的这一章中,我们展示了如何使用菜单和工具栏。
