多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java Gnome 中的菜单 > 原文: [http://zetcode.com/gui/javagnome/menus/](http://zetcode.com/gui/javagnome/menus/) 在 Java Gnome 编程教程的这一部分中,我们将使用菜单。 菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用的时间。 ## 简单菜单 在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。 `simplemenu.java` ```java package com.zetcode; import org.gnome.gdk.Event; import org.gnome.gtk.Gtk; import org.gnome.gtk.Menu; import org.gnome.gtk.MenuBar; import org.gnome.gtk.MenuItem; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; /** * ZetCode Java Gnome tutorial * * This program creates a simple menu. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GSimpleMenu extends Window { public GSimpleMenu() { setTitle("Simple menu"); initUI(); setDefaultSize(250, 200); setPosition(WindowPosition.CENTER); showAll(); } private void initUI() { connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); VBox vbox = new VBox(false, 0); MenuBar menuBar = new MenuBar(); MenuItem fileItem = new MenuItem("File"); menuBar.append(fileItem); Menu quitMenu = new Menu(); MenuItem quitItem = new MenuItem("Quit"); quitItem.connect(new MenuItem.Activate() { public void onActivate(MenuItem menuItem) { Gtk.mainQuit(); } }); quitMenu.append(quitItem); fileItem.setSubmenu(quitMenu); vbox.packStart(menuBar, false, false, 3); add(vbox); } public static void main(String[] args) { Gtk.init(args); new GSimpleMenu(); Gtk.main(); } } ``` 这是一个最小的菜单栏功能示例。 ```java MenuBar menuBar = new MenuBar(); ``` `MenuBar`小部件已创建。 ```java MenuItem fileItem = new MenuItem("File"); menuBar.append(fileItem); ``` 创建顶层`MenuItem`。 ```java Menu quitMenu = new Menu(); MenuItem quitItem = new MenuItem("Quit"); ... quitMenu.append(quitItem); ``` 创建退出`MenuItem`并将其附加到退出`Menu`。 ```java fileItem.setSubmenu(quitMenu); ``` 退出菜单设置为顶级文件菜单项的子菜单。 ```java VBox vbox = new VBox(false, 0); ... vbox.packStart(menuBar, false, false, 3); add(vbox); ``` 与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框中。 ![Simple menu](https://img.kancloud.cn/49/27/4927ea4504f413c02754d1969767c6f3_256x225.jpg) 图:简单菜单 ## 图像菜单 在下一个示例中,我们将进一步探索菜单。 我们将使用图像和分隔符。 `imagemenu.java` ```java package com.zetcode; import org.gnome.gtk.Gtk; import org.gnome.gtk.ImageMenuItem; import org.gnome.gtk.Menu; import org.gnome.gtk.MenuBar; import org.gnome.gtk.MenuItem; import org.gnome.gtk.SeparatorMenuItem; import org.gnome.gtk.Stock; import org.gnome.gtk.VBox; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; /** * ZetCode Java Gnome tutorial * * This program shows images in * the menu. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GImageMenu extends Window { public GImageMenu() { setTitle("ImageMenu"); initUI(); setDefaultSize(250, 200); setPosition(WindowPosition.CENTER); showAll(); } private void initUI() { VBox vbox = new VBox(false, 0); add(vbox); MenuBar menuBar = new MenuBar(); MenuItem file = new MenuItem("_File"); Menu fileMenu = new Menu(); ImageMenuItem imnew = new ImageMenuItem(Stock.NEW); ImageMenuItem imopen = new ImageMenuItem(Stock.OPEN); ImageMenuItem imquit = new ImageMenuItem(Stock.QUIT); imquit.connect(new MenuItem.Activate() { public void onActivate(MenuItem menuItem) { Gtk.mainQuit(); } }); fileMenu.append(imnew); fileMenu.append(imopen); fileMenu.append(new SeparatorMenuItem()); fileMenu.append(imquit); file.setSubmenu(fileMenu); menuBar.append(file); vbox.packStart(menuBar, false, false, 3); } public static void main(String[] args) { Gtk.init(args); new GImageMenu(); Gtk.main(); } } ``` 该代码示例显示了如何在 Java Gnome 的菜单中使用图像和分隔符。 ```java ImageMenuItem imnew = new ImageMenuItem(Stock.NEW); ImageMenuItem imopen = new ImageMenuItem(Stock.OPEN); ImageMenuItem imquit = new ImageMenuItem(Stock.QUIT); ``` `ImageMenuItem`对象已创建。 图像来自图像的内部库存。 ```java fileMenu.append(new SeparatorMenuItem()); ``` 此代码行创建一个分隔符。 它用于将菜单项分成逻辑组。 ![Image menu](https://img.kancloud.cn/f9/d7/f9d709a9127ebc9943e60ae15c0ef9e4_256x225.jpg) 图:图像 menu ## `CheckMenuItem` `CheckMenuItem`是带有复选框的菜单项。 它可以用于布尔属性。 `checkmenuitem.java` ```java package com.zetcode; import org.gnome.gdk.Event; import org.gnome.gtk.CheckMenuItem; import org.gnome.gtk.Gtk; import org.gnome.gtk.Label; import org.gnome.gtk.Menu; import org.gnome.gtk.MenuBar; import org.gnome.gtk.MenuItem; import org.gnome.gtk.Statusbar; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; /** * ZetCode Java Gnome tutorial * * This program creates checked menu * item. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GCheckMenuItem extends Window { private Statusbar statusbar; public GCheckMenuItem() { setTitle("Check menu item"); initUI(); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); setDefaultSize(250, 200); setPosition(WindowPosition.CENTER); showAll(); } private void initUI() { VBox vbox = new VBox(false, 0); MenuBar menuBar = new MenuBar(); MenuItem fileItem = new MenuItem("File"); menuBar.append(fileItem); Menu fileMenu = new Menu(); MenuItem quitItem = new MenuItem("Quit"); quitItem.connect(new MenuItem.Activate() { public void onActivate(MenuItem menuItem) { Gtk.mainQuit(); } }); fileMenu.append(quitItem); fileItem.setSubmenu(fileMenu); Menu viewmenu = new Menu(); MenuItem view = new MenuItem("View"); view.setSubmenu(viewmenu); CheckMenuItem stat = new CheckMenuItem("View Statusbar"); stat.setActive(true); viewmenu.append(stat); menuBar.append(view); statusbar = new Statusbar(); statusbar.setMessage("Ready"); vbox.packStart(menuBar, false, false, 0); vbox.packStart(new Label(""), true, false, 0); vbox.packStart(statusbar, false, false, 0); stat.connect(new MenuItem.Activate() { public void onActivate(MenuItem menuItem) { CheckMenuItem item = (CheckMenuItem) menuItem; if (item.getActive()) { statusbar.show(); } else { statusbar.hide(); } } }); add(vbox); } public static void main(String[] args) { Gtk.init(args); new GCheckMenuItem(); Gtk.main(); } } ``` 在我们的代码示例中,我们显示一个检查菜单项。 如果该复选框已激活,则显示状态栏小部件。 如果不是,状态栏将被隐藏。 ```java CheckMenuItem stat = new CheckMenuItem("View Statusbar"); ``` `CheckMenuItem`小部件已创建。 ```java stat.setActive(true); ``` `setActive()`方法选中/取消选中检查菜单项。 ```java if (item.getActive()) { statusbar.show(); } else { statusbar.hide(); } ``` 根据`CheckMenuItem`的状态,我们显示或隐藏状态栏小部件。 ![CheckMenuItem](https://img.kancloud.cn/e3/cb/e3cb5c8d4560902f46187929e083ce85_256x225.jpg) 图:`CheckMenuItem` ## 子菜单 我们的最后一个示例演示了如何在 Java Gnome 中创建子菜单。 `submenu.java` ```java package com.zetcode; import org.gnome.gdk.Event; import org.gnome.gtk.Gtk; import org.gnome.gtk.Menu; import org.gnome.gtk.MenuBar; import org.gnome.gtk.MenuItem; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; /** * ZetCode Java Gnome tutorial * * This program creates a submenu. * * @author jan bodnar * website zetcode.com * last modified March 2009 */ public class GSubmenu extends Window { public GSubmenu() { setTitle("Simple menu"); initUI(); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); setDefaultSize(250, 200); setPosition(WindowPosition.CENTER); showAll(); } private void initUI() { VBox vbox = new VBox(false, 0); MenuBar menuBar = new MenuBar(); MenuItem fileItem = new MenuItem("File"); menuBar.append(fileItem); Menu fileMenu = new Menu(); MenuItem quitItem = new MenuItem("Quit"); quitItem.connect(new MenuItem.Activate() { public void onActivate(MenuItem menuItem) { Gtk.mainQuit(); } }); // submenu creation Menu imenu = new Menu(); MenuItem importm = new MenuItem("Import"); importm.setSubmenu(imenu); MenuItem inews = new MenuItem("Import news feed..."); MenuItem ibookmarks = new MenuItem("Import bookmarks..."); MenuItem imail = new MenuItem("Import mail..."); imenu.append(inews); imenu.append(ibookmarks); imenu.append(imail); fileMenu.append(importm); fileMenu.append(quitItem); fileItem.setSubmenu(fileMenu); vbox.packStart(menuBar, false, false, 3); add(vbox); } public static void main(String[] args) { Gtk.init(args); new GSubmenu(); Gtk.main(); } } ``` 子菜单创建。 ```java Menu imenu = new Menu(); ``` 子菜单是`Menu`。 ```java MenuItem importm = new MenuItem("Import"); importm.setSubmenu(imenu); ``` 它是菜单项的子菜单,它会登录到顶级文件菜单。 ```java MenuItem inews = new MenuItem("Import news feed..."); MenuItem ibookmarks = new MenuItem("Import bookmarks..."); MenuItem imail = new MenuItem("Import mail..."); imenu.append(inews); imenu.append(ibookmarks); imenu.append(imail); ``` 子菜单有其自己的菜单项。 ![Submenu](https://img.kancloud.cn/72/4e/724e0b00cc4939a9590b400e32d23d6a_256x225.jpg) 图:子菜单 在 Java Gnome 编程库的这一章中,我们展示了如何使用菜单。