原文: http://zetcode.com/gui/javaswt/menustoolbars/

在 Java SWT 教程的这一部分中,我们使用菜单和工具栏。

菜单栏是 GUI 应用的常见部分。 它是位于各个菜单中的一组命令。

简单菜单

在第一个示例中,我们创建一个带有一个文件菜单的菜单栏。 该菜单只有一个菜单项。 通过选择项目,应用结束。

SimpleMenuEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.widgets.Display;
  4. import org.eclipse.swt.widgets.Menu;
  5. import org.eclipse.swt.widgets.MenuItem;
  6. import org.eclipse.swt.widgets.Shell;
  7. /**
  8. * ZetCode Java SWT tutorial
  9. *
  10. * This program creates a simple menu.
  11. *
  12. * Author: Jan Bodnar
  13. * Website: zetcode.com
  14. * Last modified: June 2015
  15. */
  16. public class SimpleMenuEx {
  17. public SimpleMenuEx(Display display) {
  18. initUI(display);
  19. }
  20. private void initUI(Display display) {
  21. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  22. Menu menuBar = new Menu(shell, SWT.BAR);
  23. MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
  24. cascadeFileMenu.setText("&File");
  25. Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
  26. cascadeFileMenu.setMenu(fileMenu);
  27. MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
  28. exitItem.setText("&Exit");
  29. shell.setMenuBar(menuBar);
  30. exitItem.addListener(SWT.Selection, event-> {
  31. shell.getDisplay().dispose();
  32. System.exit(0);
  33. });
  34. shell.setText("Simple menu");
  35. shell.setSize(300, 200);
  36. shell.open();
  37. while (!shell.isDisposed()) {
  38. if (!display.readAndDispatch()) {
  39. display.sleep();
  40. }
  41. }
  42. }
  43. @SuppressWarnings("unused")
  44. public static void main(String[] args) {
  45. Display display = new Display();
  46. SimpleMenuEx ex = new SimpleMenuEx(display);
  47. display.dispose();
  48. }
  49. }

这是一个最小的菜单栏功能示例。

  1. Menu menuBar = new Menu(shell, SWT.BAR);

SWT.BAR选项传递给Menu将创建一个菜单栏。

  1. MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
  2. cascadeFileMenu.setText("&File");

顶级菜单项是级联菜单项。 他们收到SWT.CASCADE选项。

  1. Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
  2. cascadeFileMenu.setMenu(fileMenu);

下拉菜单是使用SWT.DROP_DOWN选项创建的。

  1. MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
  2. exitItem.setText("&Exit");

推菜单项已插入下拉菜单中。 它是使用SWT.PUSH选项创建的。

  1. shell.setMenuBar(menuBar);

setMenuBar()在外壳上设置菜单栏。

  1. exitItem.addListener(SWT.Selection, event-> {
  2. shell.getDisplay().dispose();
  3. System.exit(0);
  4. });

当我们选择退出推送菜单项时,应用终止。

Java SWT 中的菜单和工具栏 - 图1

图:简单菜单

子菜单

下一个示例演示如何创建子菜单。

SubMenuEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.widgets.Display;
  4. import org.eclipse.swt.widgets.Menu;
  5. import org.eclipse.swt.widgets.MenuItem;
  6. import org.eclipse.swt.widgets.Shell;
  7. /**
  8. * ZetCode Java SWT tutorial
  9. *
  10. * This program creates a submenu.
  11. *
  12. * Author: Jan Bodnar
  13. * Website: zetcode.com
  14. * Last modified: June 2015
  15. */
  16. public class SubMenuEx {
  17. public SubMenuEx(Display display) {
  18. initUI(display);
  19. }
  20. private void initUI(Display display) {
  21. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  22. Menu menuBar = new Menu(shell, SWT.BAR);
  23. MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
  24. cascadeFileMenu.setText("&File");
  25. Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
  26. cascadeFileMenu.setMenu(fileMenu);
  27. MenuItem cascadeEditMenu = new MenuItem(menuBar, SWT.CASCADE);
  28. cascadeEditMenu.setText("&Edit");
  29. MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
  30. subMenuItem.setText("Import");
  31. Menu submenu = new Menu(shell, SWT.DROP_DOWN);
  32. subMenuItem.setMenu(submenu);
  33. MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);
  34. feedItem.setText("&Import news feed...");
  35. MenuItem bmarks = new MenuItem(submenu, SWT.PUSH);
  36. bmarks.setText("&Import bookmarks...");
  37. MenuItem mailItem = new MenuItem(submenu, SWT.PUSH);
  38. mailItem.setText("&Import mail...");
  39. MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
  40. exitItem.setText("&Exit");
  41. shell.setMenuBar(menuBar);
  42. exitItem.addListener(SWT.Selection, event-> {
  43. shell.getDisplay().dispose();
  44. System.exit(0);
  45. });
  46. shell.setText("Submenu");
  47. shell.setSize(300, 250);
  48. shell.open();
  49. while (!shell.isDisposed()) {
  50. if (!display.readAndDispatch()) {
  51. display.sleep();
  52. }
  53. }
  54. }
  55. @SuppressWarnings("unused")
  56. public static void main(String[] args) {
  57. Display display = new Display();
  58. SubMenuEx ex = new SubMenuEx(display);
  59. display.dispose();
  60. }
  61. }

该示例在另一个菜单内创建一个菜单。

  1. MenuItem subMenuItem = new MenuItem(fileMenu, SWT.CASCADE);
  2. subMenuItem.setText("Import");

子菜单的创建类似于创建普通菜单。 首先,我们创建一个层叠菜单项。 唯一的区别是父窗口小部件。 这次,父级是子菜单所属的菜单对象。

  1. MenuItem feedItem = new MenuItem(submenu, SWT.PUSH);
  2. feedItem.setText("&Import news feed...");

我们创建一个推菜单项。 父窗口小部件是子菜单对象。

Java SWT 中的菜单和工具栏 - 图2

图:子菜单

CheckMenuItem

CheckMenuItem是带有复选框的菜单项。 它可以用于布尔属性。

CheckMenuItemEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.events.SelectionAdapter;
  4. import org.eclipse.swt.events.SelectionEvent;
  5. import org.eclipse.swt.layout.FormAttachment;
  6. import org.eclipse.swt.layout.FormData;
  7. import org.eclipse.swt.layout.FormLayout;
  8. import org.eclipse.swt.widgets.Display;
  9. import org.eclipse.swt.widgets.Event;
  10. import org.eclipse.swt.widgets.Label;
  11. import org.eclipse.swt.widgets.Listener;
  12. import org.eclipse.swt.widgets.Menu;
  13. import org.eclipse.swt.widgets.MenuItem;
  14. import org.eclipse.swt.widgets.Shell;
  15. /**
  16. * ZetCode Java SWT tutorial
  17. *
  18. * This program creates a check menu item.
  19. * It will show or hide a statusbar.
  20. *
  21. * Author: Jan Bodnar
  22. * Website: zetcode.com
  23. * Last modified: June 2015
  24. */
  25. public class CheckMenuItemEx {
  26. private Shell shell;
  27. private Label status;
  28. private MenuItem statItem;
  29. public CheckMenuItemEx(Display display) {
  30. initUI(display);
  31. }
  32. public void initUI(Display display) {
  33. shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  34. Menu menuBar = new Menu(shell, SWT.BAR);
  35. shell.setMenuBar(menuBar);
  36. MenuItem cascadeFileMenu = new MenuItem(menuBar, SWT.CASCADE);
  37. cascadeFileMenu.setText("&File");
  38. Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
  39. cascadeFileMenu.setMenu(fileMenu);
  40. MenuItem exitItem = new MenuItem(fileMenu, SWT.PUSH);
  41. exitItem.setText("&Exit");
  42. MenuItem cascadeViewMenu = new MenuItem(menuBar, SWT.CASCADE);
  43. cascadeViewMenu.setText("&View");
  44. Menu viewMenu = new Menu(shell, SWT.DROP_DOWN);
  45. cascadeViewMenu.setMenu(viewMenu);
  46. statItem = new MenuItem(viewMenu, SWT.CHECK);
  47. statItem.setSelection(true);
  48. statItem.setText("&View Statusbar");
  49. statItem.addListener(SWT.Selection, new MyStatusListener());
  50. exitItem.addSelectionListener(new MySelectionAdapter());
  51. status = new Label(shell, SWT.BORDER);
  52. status.setText("Ready");
  53. FormLayout layout = new FormLayout();
  54. shell.setLayout(layout);
  55. FormData labelData = new FormData();
  56. labelData.left = new FormAttachment(0);
  57. labelData.right = new FormAttachment(100);
  58. labelData.bottom = new FormAttachment(100);
  59. status.setLayoutData(labelData);
  60. shell.setText("Check menu item");
  61. shell.setSize(300, 250);
  62. shell.open();
  63. while (!shell.isDisposed()) {
  64. if (!display.readAndDispatch()) {
  65. display.sleep();
  66. }
  67. }
  68. }
  69. private class MyStatusListener implements Listener {
  70. @Override
  71. public void handleEvent(Event event) {
  72. if (statItem.getSelection()) {
  73. status.setVisible(true);
  74. } else {
  75. status.setVisible(false);
  76. }
  77. }
  78. }
  79. private class MySelectionAdapter extends SelectionAdapter {
  80. @Override
  81. public void widgetSelected(SelectionEvent e) {
  82. shell.getDisplay().dispose();
  83. System.exit(0);
  84. }
  85. }
  86. @SuppressWarnings("unused")
  87. public static void main(String[] args) {
  88. Display display = new Display();
  89. CheckMenuItemEx ex = new CheckMenuItemEx(display);
  90. display.dispose();
  91. }
  92. }

在我们的代码示例中,我们显示一个检查菜单项。 如果该复选框已激活,则会显示状态栏。 如果不是,状态栏将被隐藏。

  1. statItem = new MenuItem(viewMenu, SWT.CHECK);

SWT.CHECK标志将创建一个检查菜单项。

  1. statItem.setSelection(true);

setSelection()方法选中或取消选中检查菜单项。

  1. if (statItem.getSelection()) {
  2. status.setVisible(true);
  3. } else {
  4. status.setVisible(false);
  5. }

根据检查菜单项的状态,我们显示或隐藏标签小部件。

Java SWT 中的菜单和工具栏 - 图3

图:选中菜单项

弹出菜单

在下一个示例中,我们创建一个弹出菜单。 弹出菜单也称为上下文菜单。 当我们右键单击一个对象时,将显示此类型的菜单。

PopupMenuEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.widgets.Display;
  4. import org.eclipse.swt.widgets.Menu;
  5. import org.eclipse.swt.widgets.MenuItem;
  6. import org.eclipse.swt.widgets.Shell;
  7. /**
  8. * ZetCode Java SWT tutorial
  9. *
  10. * This program creates a popup menu.
  11. *
  12. * Author: Jan Bodnar
  13. * Website: zetcode.com
  14. * Last modified: June 2015
  15. */
  16. public class PopupMenuEx {
  17. public PopupMenuEx(Display display) {
  18. initUI(display);
  19. }
  20. private void initUI(Display display) {
  21. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  22. Menu menu = new Menu(shell, SWT.POP_UP);
  23. MenuItem minItem = new MenuItem(menu, SWT.PUSH);
  24. minItem.setText("Minimize");
  25. minItem.addListener(SWT.Selection, event -> {
  26. shell.setMinimized(true);
  27. });
  28. MenuItem exitItem = new MenuItem(menu, SWT.PUSH);
  29. exitItem.setText("Exit");
  30. exitItem.addListener(SWT.Selection, event -> {
  31. shell.getDisplay().dispose();
  32. System.exit(0);
  33. });
  34. shell.setText("Popup menu");
  35. shell.setMenu(menu);
  36. shell.setSize(300, 250);
  37. shell.open();
  38. while (!shell.isDisposed()) {
  39. if (!display.readAndDispatch()) {
  40. display.sleep();
  41. }
  42. }
  43. }
  44. @SuppressWarnings("unused")
  45. public static void main(String[] args) {
  46. Display display = new Display();
  47. PopupMenuEx ex = new PopupMenuEx(display);
  48. display.dispose();
  49. }
  50. }

在我们的代码示例中,我们创建一个带有两个菜单项的弹出菜单。 第一个最小化窗口,第二个终止应用。

  1. Menu menu = new Menu(shell, SWT.POP_UP);

使用SWT.POP_UP标志创建弹出菜单。

  1. MenuItem minItem = new MenuItem(menu, SWT.PUSH);
  2. minItem.setText("Minimize");

弹出菜单中的菜单项是普通的推菜单项。

  1. minItem.addListener(SWT.Selection, event -> {
  2. shell.setMinimized(true);
  3. });

setMinimized()方法将窗口最小化。

  1. shell.setMenu(menu);

我们为外壳设置一个弹出菜单。

Java SWT 中的菜单和工具栏 - 图4

图:弹出菜单

简单的工具栏

菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。 在下面的示例中,我们创建一个简单的工具栏。

SimpleToolBarEx.java

  1. package com.zetcode;
  2. import org.eclipse.swt.SWT;
  3. import org.eclipse.swt.graphics.Device;
  4. import org.eclipse.swt.graphics.Image;
  5. import org.eclipse.swt.widgets.Display;
  6. import org.eclipse.swt.widgets.Shell;
  7. import org.eclipse.swt.widgets.ToolBar;
  8. import org.eclipse.swt.widgets.ToolItem;
  9. /**
  10. * ZetCode Java SWT tutorial
  11. *
  12. * This program creates a simple toolbar.
  13. *
  14. * Author: Jan Bodnar
  15. * Website: zetcode.com
  16. * Last modified: June 2015
  17. */
  18. public class SimpleToolBarEx {
  19. private Image newi;
  20. private Image opei;
  21. private Image quii;
  22. public SimpleToolBarEx(Display display) {
  23. initUI(display);
  24. }
  25. @SuppressWarnings("unused")
  26. public void initUI(Display display) {
  27. Shell shell = new Shell(display, SWT.SHELL_TRIM | SWT.CENTER);
  28. Device dev = shell.getDisplay();
  29. try {
  30. newi = new Image(dev, "new.png");
  31. opei = new Image(dev, "open.png");
  32. quii = new Image(dev, "quit.png");
  33. } catch (Exception e) {
  34. System.out.println("Cannot load images");
  35. System.out.println(e.getMessage());
  36. System.exit(1);
  37. }
  38. ToolBar toolBar = new ToolBar(shell, SWT.BORDER);
  39. ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);
  40. item1.setImage(newi);
  41. ToolItem item2 = new ToolItem(toolBar, SWT.PUSH);
  42. item2.setImage(opei);
  43. ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);
  44. ToolItem item3 = new ToolItem(toolBar, SWT.PUSH);
  45. item3.setImage(quii);
  46. toolBar.pack();
  47. item3.addListener(SWT.Selection, event -> {
  48. shell.getDisplay().dispose();
  49. System.exit(0);
  50. });
  51. shell.setText("Simple toolbar");
  52. shell.setSize(300, 250);
  53. shell.open();
  54. while (!shell.isDisposed()) {
  55. if (!display.readAndDispatch()) {
  56. display.sleep();
  57. }
  58. }
  59. }
  60. @Override
  61. public void finalize() {
  62. newi.dispose();
  63. opei.dispose();
  64. quii.dispose();
  65. }
  66. public static void main(String[] args) {
  67. Display display = new Display();
  68. SimpleToolBarEx ex = new SimpleToolBarEx(display);
  69. ex.finalize();
  70. display.dispose();
  71. }
  72. }

该示例显示了一个工具栏和三个工具项。

  1. ToolBar toolBar = new ToolBar(shell, SWT.BORDER);

工具栏已创建。

  1. ToolItem item1 = new ToolItem(toolBar, SWT.PUSH);
  2. item1.setImage(newi);

我们创建一个带有图像的工具项。

  1. ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);

在这里,我们创建一个垂直分隔符。

Java SWT 中的菜单和工具栏 - 图5

图:工具栏

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