在 JRuby Swing 编程教程的这一部分中,我们将使用菜单和工具栏。
菜单栏是 GUI 应用中最可见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,您必须记住所有这些神秘命令,在这里,我们将大多数命令分组为逻辑部分。 有公认的标准可以进一步减少学习新应用的时间。 菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。
简单菜单
第一个示例将显示一个简单的菜单。
#!/usr/local/bin/jruby# ZetCode JRuby Swing tutorial## This program creates a simple# menu.## author: Jan Bodnar# website: www.zetcode.com# last modified: December 2010include Javaimport java.awt.event.KeyEventimport javax.swing.JButtonimport javax.swing.JFrameimport javax.swing.JMenuBarimport javax.swing.JMenuItemimport javax.swing.JMenuimport javax.swing.ImageIconimport java.lang.Systemclass Example < JFramedef initializesuper "Simple menu"self.initUIenddef initUImenubar = JMenuBar.newicon = ImageIcon.new "exit.png"fileMenu = JMenu.new "File"fileMenu.setMnemonic KeyEvent::VK_FitemExit = JMenuItem.new "Exit", iconitemExit.addActionListener do |e|System.exit 0enditemExit.setMnemonic KeyEvent::VK_CitemExit.setToolTipText "Exit application"fileMenu.add itemExitmenubar.add fileMenuself.setJMenuBar menubarself.setDefaultCloseOperation JFrame::EXIT_ON_CLOSEself.setSize 250, 200self.setLocationRelativeTo nilself.setVisible trueendendExample.new
我们的示例将显示一个菜单项。 通过选择退出菜单项,我们关闭应用。
menubar = JMenuBar.new
在这里,我们创建一个菜单栏。
icon = ImageIcon.new "exit.png"
我们将在菜单项中显示一个图标。
fileMenu = JMenu.new "File"fileMenu.setMnemonic KeyEvent::VK_F
我们创建一个菜单对象。 菜单是包含JMenuItem的弹出窗口。 菜单位于菜单栏上。 也可以通过键盘访问菜单。 要将菜单绑定到特定键,我们使用setMnemonic方法。 在我们的情况下,可以使用ALT + F快捷方式打开菜单。
itemExit = JMenuItem.new "Close", iconitemExit.addActionListener do |e|System.exit 0end
在这里,我们创建一个JMenuItem。 菜单项是显示在所选菜单的弹出窗口中的对象。 我们还为菜单项和工具提示提供了快捷方式。
fileMenu.add itemExit
菜单项被添加到菜单中。
menubar.add fileMenu
菜单添加到菜单栏。

图:简单菜单
子菜单
子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。
#!/usr/local/bin/jruby# ZetCode JRuby Swing tutorial## This program creates a# submenu.## author: Jan Bodnar# website: www.zetcode.com# last modified: December 2010include Javaimport java.awt.event.KeyEventimport java.awt.event.ActionEventimport javax.swing.JFrameimport javax.swing.ImageIconimport javax.swing.JMenuBarimport javax.swing.JMenuimport javax.swing.JMenuItemimport javax.swing.KeyStrokeimport java.lang.Systemclass Example < JFramedef initializesuper "Submenu"self.initUIenddef initUImenubar = JMenuBar.newiconNew = ImageIcon.new "new.png"iconOpen = ImageIcon.new "open.png"iconSave = ImageIcon.new "save.png"iconExit = ImageIcon.new "exit.png"fileMenu = JMenu.new "File"fileMenu.setMnemonic KeyEvent::VK_Fimp = JMenu.new "Import"imp.setMnemonic KeyEvent::VK_Mnewsf = JMenuItem.new "Import newsfeed list..."bookm = JMenuItem.new "Import bookmarks..."mail = JMenuItem.new "Import mail..."imp.add newsfimp.add bookmimp.add mailfileNew = JMenuItem.new "New", iconNewfileNew.setMnemonic KeyEvent::VK_NfileOpen = JMenuItem.new "Open", iconOpenfileNew.setMnemonic KeyEvent::VK_OfileSave = JMenuItem.new "Save", iconSavefileSave.setMnemonic KeyEvent::VK_SfileExit = JMenuItem.new "Exit", iconExitfileExit.addActionListener do |e|System.exit 0endfileExit.setMnemonic KeyEvent::VK_CfileExit.setToolTipText "Exit application"fileExit.setAccelerator KeyStroke.getKeyStroke KeyEvent::VK_W,ActionEvent::CTRL_MASKfileMenu.add fileNewfileMenu.add fileOpenfileMenu.add fileSavefileMenu.addSeparatorfileMenu.add impfileMenu.addSeparatorfileMenu.add fileExitmenubar.add fileMenuself.setJMenuBar menubarself.setDefaultCloseOperation JFrame::EXIT_ON_CLOSEself.setSize 320, 220self.setLocationRelativeTo nilself.setVisible trueendendExample.new
在示例中,文件菜单的子菜单中有三个选项。
imp = JMenu.new "Import"...fileMenu.add imp
子菜单与其他任何普通菜单一样。 它是用相同的方式创建的。 我们只需将菜单添加到现有菜单即可。
fileExit.setAccelerator KeyStroke.getKeyStroke KeyEvent::VK_W,ActionEvent::CTRL_MASK
加速器是启动菜单项的快捷键。 在我们的情况下,通过按 Ctrl + W 关闭我们的应用。
fileMenu.addSeparator
分隔符是一条水平线,用于在视觉上分隔菜单项。 这样,我们可以将项目分组到一些合理的位置。

图:子菜单
弹出菜单
在下一个示例中,我们创建一个弹出菜单。
#!/usr/local/bin/jruby# ZetCode JRuby Swing tutorial## This program creates a# popup menu.## author: Jan Bodnar# website: www.zetcode.com# last modified: December 2010include Javaimport java.awt.event.MouseAdapterimport javax.swing.JFrameimport javax.swing.JPopupMenuimport javax.swing.JMenuItemimport java.lang.Systemclass MouseAction < MouseAdapterdef mouseReleased esource = e.sourcemenu = source.getMenuif e.getButton == e.buttonmenu.show e.getComponent, e.getX, e.getYendendendclass Example < JFramedef initializesuper "Popup menu"self.initUIenddef initUI@menu = JPopupMenu.newmenuItemBeep = JMenuItem.new "Beep"menuItemBeep.addActionListener do |e|toolkit = getToolkittoolkit.beepend@menu.add menuItemBeepmenuItemExit = JMenuItem.new "Exit"menuItemExit.addActionListener do |e|System.exit 0end@menu.add menuItemExitself.addMouseListener MouseAction.newself.setDefaultCloseOperation JFrame::EXIT_ON_CLOSEself.setSize 250, 200self.setLocationRelativeTo nilself.setVisible trueenddef getMenu@menuendendExample.new
在我们的示例中,我们创建一个带有两个菜单项的弹出菜单。
@menu = JPopupMenu.newmenuItemBeep = JMenuItem.new "Beep"
我们创建一个弹出菜单和一个菜单项。
self.addMouseListener MouseAction.new
我们将鼠标监听器添加到Example类。 鼠标监听器是MouseAction用户定义的类,该类继承自MouseAdapter。 这是一个便利类,可实现所有五个必需的方法。 方法为空。 除了实现所有五个方法之外,我们仅实现所需的方法。
class MouseAction < MouseAdapterdef mouseReleased e...
在我们的MouseAction类中,我们实现了mouseReleased方法。
if e.getButton == e.button:menu.show e.getComponent, e.getX, e.getYend
我们在鼠标单击的 x,y 坐标处显示弹出菜单窗口。

图:弹出菜单
工具栏
菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。 在 Swing 中,JToolBar类在应用中创建一个工具栏。
#!/usr/local/bin/jruby# ZetCode JRuby Swing tutorial## This program creates a# toolbar.## author: Jan Bodnar# website: www.zetcode.com# last modified: December 2010include Javaimport java.awt.BorderLayoutimport javax.swing.JFrameimport javax.swing.ImageIconimport javax.swing.JButtonimport javax.swing.JMenuBarimport javax.swing.JMenuimport javax.swing.JToolBarimport java.lang.Systemclass Example < JFramedef initializesuper "Toolbar"self.initUIenddef initUImenubar = JMenuBar.newfileMenu = JMenu.new "File"menubar.add fileMenutoolbar = JToolBar.newiconExit = ImageIcon.new "exit2.png"exitButton = JButton.new iconExitexitButton.addActionListener do |e|System.exit 0endtoolbar.add exitButtonself.add toolbar, BorderLayout::NORTHself.setJMenuBar menubarself.setDefaultCloseOperation JFrame::EXIT_ON_CLOSEself.setSize 350, 250self.setLocationRelativeTo nilself.setVisible trueendendExample.new
该示例创建一个带有一个退出按钮的工具栏。
toolbar = JToolBar.new
工具栏已创建。
exitButton = JButton.new iconExit...toolbar.add exitButton
我们创建一个按钮并将其添加到工具栏。
self.add toolbar, BorderLayout::NORTH
工具栏位于BorderLayout管理器的北部。 BorderLayout管理器是JFrame容器的默认布局管理器。

图:工具栏
在 JRuby Swing 教程的这一部分中,我们提到了菜单和工具栏。
