原文: http://zetcode.com/gui/javagnome/menus/

在 Java Gnome 编程教程的这一部分中,我们将使用菜单。

菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用的时间。

简单菜单

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

simplemenu.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Gtk;
  4. import org.gnome.gtk.Menu;
  5. import org.gnome.gtk.MenuBar;
  6. import org.gnome.gtk.MenuItem;
  7. import org.gnome.gtk.VBox;
  8. import org.gnome.gtk.Widget;
  9. import org.gnome.gtk.Window;
  10. import org.gnome.gtk.WindowPosition;
  11. /**
  12. * ZetCode Java Gnome tutorial
  13. *
  14. * This program creates a simple menu.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GSimpleMenu extends Window {
  21. public GSimpleMenu() {
  22. setTitle("Simple menu");
  23. initUI();
  24. setDefaultSize(250, 200);
  25. setPosition(WindowPosition.CENTER);
  26. showAll();
  27. }
  28. private void initUI() {
  29. connect(new Window.DeleteEvent() {
  30. public boolean onDeleteEvent(Widget source, Event event) {
  31. Gtk.mainQuit();
  32. return false;
  33. }
  34. });
  35. VBox vbox = new VBox(false, 0);
  36. MenuBar menuBar = new MenuBar();
  37. MenuItem fileItem = new MenuItem("File");
  38. menuBar.append(fileItem);
  39. Menu quitMenu = new Menu();
  40. MenuItem quitItem = new MenuItem("Quit");
  41. quitItem.connect(new MenuItem.Activate() {
  42. public void onActivate(MenuItem menuItem) {
  43. Gtk.mainQuit();
  44. }
  45. });
  46. quitMenu.append(quitItem);
  47. fileItem.setSubmenu(quitMenu);
  48. vbox.packStart(menuBar, false, false, 3);
  49. add(vbox);
  50. }
  51. public static void main(String[] args) {
  52. Gtk.init(args);
  53. new GSimpleMenu();
  54. Gtk.main();
  55. }
  56. }

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

  1. MenuBar menuBar = new MenuBar();

MenuBar小部件已创建。

  1. MenuItem fileItem = new MenuItem("File");
  2. menuBar.append(fileItem);

创建顶层MenuItem

  1. Menu quitMenu = new Menu();
  2. MenuItem quitItem = new MenuItem("Quit");
  3. ...
  4. quitMenu.append(quitItem);

创建退出MenuItem并将其附加到退出Menu

  1. fileItem.setSubmenu(quitMenu);

退出菜单设置为顶级文件菜单项的子菜单。

  1. VBox vbox = new VBox(false, 0);
  2. ...
  3. vbox.packStart(menuBar, false, false, 3);
  4. add(vbox);

与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框中。

Java Gnome 中的菜单 - 图1

图:简单菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将使用图像和分隔符。

imagemenu.java

  1. package com.zetcode;
  2. import org.gnome.gtk.Gtk;
  3. import org.gnome.gtk.ImageMenuItem;
  4. import org.gnome.gtk.Menu;
  5. import org.gnome.gtk.MenuBar;
  6. import org.gnome.gtk.MenuItem;
  7. import org.gnome.gtk.SeparatorMenuItem;
  8. import org.gnome.gtk.Stock;
  9. import org.gnome.gtk.VBox;
  10. import org.gnome.gtk.Window;
  11. import org.gnome.gtk.WindowPosition;
  12. /**
  13. * ZetCode Java Gnome tutorial
  14. *
  15. * This program shows images in
  16. * the menu.
  17. *
  18. * @author jan bodnar
  19. * website zetcode.com
  20. * last modified March 2009
  21. */
  22. public class GImageMenu extends Window {
  23. public GImageMenu() {
  24. setTitle("ImageMenu");
  25. initUI();
  26. setDefaultSize(250, 200);
  27. setPosition(WindowPosition.CENTER);
  28. showAll();
  29. }
  30. private void initUI() {
  31. VBox vbox = new VBox(false, 0);
  32. add(vbox);
  33. MenuBar menuBar = new MenuBar();
  34. MenuItem file = new MenuItem("_File");
  35. Menu fileMenu = new Menu();
  36. ImageMenuItem imnew = new ImageMenuItem(Stock.NEW);
  37. ImageMenuItem imopen = new ImageMenuItem(Stock.OPEN);
  38. ImageMenuItem imquit = new ImageMenuItem(Stock.QUIT);
  39. imquit.connect(new MenuItem.Activate() {
  40. public void onActivate(MenuItem menuItem) {
  41. Gtk.mainQuit();
  42. }
  43. });
  44. fileMenu.append(imnew);
  45. fileMenu.append(imopen);
  46. fileMenu.append(new SeparatorMenuItem());
  47. fileMenu.append(imquit);
  48. file.setSubmenu(fileMenu);
  49. menuBar.append(file);
  50. vbox.packStart(menuBar, false, false, 3);
  51. }
  52. public static void main(String[] args) {
  53. Gtk.init(args);
  54. new GImageMenu();
  55. Gtk.main();
  56. }
  57. }

该代码示例显示了如何在 Java Gnome 的菜单中使用图像和分隔符。

  1. ImageMenuItem imnew = new ImageMenuItem(Stock.NEW);
  2. ImageMenuItem imopen = new ImageMenuItem(Stock.OPEN);
  3. ImageMenuItem imquit = new ImageMenuItem(Stock.QUIT);

ImageMenuItem对象已创建。 图像来自图像的内部库存。

  1. fileMenu.append(new SeparatorMenuItem());

此代码行创建一个分隔符。 它用于将菜单项分成逻辑组。

Java Gnome 中的菜单 - 图2

图:图像 menu

CheckMenuItem

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

checkmenuitem.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.CheckMenuItem;
  4. import org.gnome.gtk.Gtk;
  5. import org.gnome.gtk.Label;
  6. import org.gnome.gtk.Menu;
  7. import org.gnome.gtk.MenuBar;
  8. import org.gnome.gtk.MenuItem;
  9. import org.gnome.gtk.Statusbar;
  10. import org.gnome.gtk.VBox;
  11. import org.gnome.gtk.Widget;
  12. import org.gnome.gtk.Window;
  13. import org.gnome.gtk.WindowPosition;
  14. /**
  15. * ZetCode Java Gnome tutorial
  16. *
  17. * This program creates checked menu
  18. * item.
  19. *
  20. * @author jan bodnar
  21. * website zetcode.com
  22. * last modified March 2009
  23. */
  24. public class GCheckMenuItem extends Window {
  25. private Statusbar statusbar;
  26. public GCheckMenuItem() {
  27. setTitle("Check menu item");
  28. initUI();
  29. connect(new Window.DeleteEvent() {
  30. public boolean onDeleteEvent(Widget source, Event event) {
  31. Gtk.mainQuit();
  32. return false;
  33. }
  34. });
  35. setDefaultSize(250, 200);
  36. setPosition(WindowPosition.CENTER);
  37. showAll();
  38. }
  39. private void initUI() {
  40. VBox vbox = new VBox(false, 0);
  41. MenuBar menuBar = new MenuBar();
  42. MenuItem fileItem = new MenuItem("File");
  43. menuBar.append(fileItem);
  44. Menu fileMenu = new Menu();
  45. MenuItem quitItem = new MenuItem("Quit");
  46. quitItem.connect(new MenuItem.Activate() {
  47. public void onActivate(MenuItem menuItem) {
  48. Gtk.mainQuit();
  49. }
  50. });
  51. fileMenu.append(quitItem);
  52. fileItem.setSubmenu(fileMenu);
  53. Menu viewmenu = new Menu();
  54. MenuItem view = new MenuItem("View");
  55. view.setSubmenu(viewmenu);
  56. CheckMenuItem stat = new CheckMenuItem("View Statusbar");
  57. stat.setActive(true);
  58. viewmenu.append(stat);
  59. menuBar.append(view);
  60. statusbar = new Statusbar();
  61. statusbar.setMessage("Ready");
  62. vbox.packStart(menuBar, false, false, 0);
  63. vbox.packStart(new Label(""), true, false, 0);
  64. vbox.packStart(statusbar, false, false, 0);
  65. stat.connect(new MenuItem.Activate() {
  66. public void onActivate(MenuItem menuItem) {
  67. CheckMenuItem item = (CheckMenuItem) menuItem;
  68. if (item.getActive()) {
  69. statusbar.show();
  70. } else {
  71. statusbar.hide();
  72. }
  73. }
  74. });
  75. add(vbox);
  76. }
  77. public static void main(String[] args) {
  78. Gtk.init(args);
  79. new GCheckMenuItem();
  80. Gtk.main();
  81. }
  82. }

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

  1. CheckMenuItem stat = new CheckMenuItem("View Statusbar");

CheckMenuItem小部件已创建。

  1. stat.setActive(true);

setActive()方法选中/取消选中检查菜单项。

  1. if (item.getActive()) {
  2. statusbar.show();
  3. } else {
  4. statusbar.hide();
  5. }

根据CheckMenuItem的状态,我们显示或隐藏状态栏小部件。

Java Gnome 中的菜单 - 图3

图:CheckMenuItem

子菜单

我们的最后一个示例演示了如何在 Java Gnome 中创建子菜单。

submenu.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Gtk;
  4. import org.gnome.gtk.Menu;
  5. import org.gnome.gtk.MenuBar;
  6. import org.gnome.gtk.MenuItem;
  7. import org.gnome.gtk.VBox;
  8. import org.gnome.gtk.Widget;
  9. import org.gnome.gtk.Window;
  10. import org.gnome.gtk.WindowPosition;
  11. /**
  12. * ZetCode Java Gnome tutorial
  13. *
  14. * This program creates a submenu.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GSubmenu extends Window {
  21. public GSubmenu() {
  22. setTitle("Simple menu");
  23. initUI();
  24. connect(new Window.DeleteEvent() {
  25. public boolean onDeleteEvent(Widget source, Event event) {
  26. Gtk.mainQuit();
  27. return false;
  28. }
  29. });
  30. setDefaultSize(250, 200);
  31. setPosition(WindowPosition.CENTER);
  32. showAll();
  33. }
  34. private void initUI() {
  35. VBox vbox = new VBox(false, 0);
  36. MenuBar menuBar = new MenuBar();
  37. MenuItem fileItem = new MenuItem("File");
  38. menuBar.append(fileItem);
  39. Menu fileMenu = new Menu();
  40. MenuItem quitItem = new MenuItem("Quit");
  41. quitItem.connect(new MenuItem.Activate() {
  42. public void onActivate(MenuItem menuItem) {
  43. Gtk.mainQuit();
  44. }
  45. });
  46. // submenu creation
  47. Menu imenu = new Menu();
  48. MenuItem importm = new MenuItem("Import");
  49. importm.setSubmenu(imenu);
  50. MenuItem inews = new MenuItem("Import news feed...");
  51. MenuItem ibookmarks = new MenuItem("Import bookmarks...");
  52. MenuItem imail = new MenuItem("Import mail...");
  53. imenu.append(inews);
  54. imenu.append(ibookmarks);
  55. imenu.append(imail);
  56. fileMenu.append(importm);
  57. fileMenu.append(quitItem);
  58. fileItem.setSubmenu(fileMenu);
  59. vbox.packStart(menuBar, false, false, 3);
  60. add(vbox);
  61. }
  62. public static void main(String[] args) {
  63. Gtk.init(args);
  64. new GSubmenu();
  65. Gtk.main();
  66. }
  67. }

子菜单创建。

  1. Menu imenu = new Menu();

子菜单是Menu

  1. MenuItem importm = new MenuItem("Import");
  2. importm.setSubmenu(imenu);

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. MenuItem inews = new MenuItem("Import news feed...");
  2. MenuItem ibookmarks = new MenuItem("Import bookmarks...");
  3. MenuItem imail = new MenuItem("Import mail...");
  4. imenu.append(inews);
  5. imenu.append(ibookmarks);
  6. imenu.append(imail);

子菜单有其自己的菜单项。

Java Gnome 中的菜单 - 图4

图:子菜单

在 Java Gnome 编程库的这一章中,我们展示了如何使用菜单。