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

在 JRuby Swing 编程教程的这一部分中,我们将使用菜单和工具栏。

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

简单菜单

第一个示例将显示一个简单的菜单。

  1. #!/usr/local/bin/jruby
  2. # ZetCode JRuby Swing tutorial
  3. #
  4. # This program creates a simple
  5. # menu.
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: December 2010
  10. include Java
  11. import java.awt.event.KeyEvent
  12. import javax.swing.JButton
  13. import javax.swing.JFrame
  14. import javax.swing.JMenuBar
  15. import javax.swing.JMenuItem
  16. import javax.swing.JMenu
  17. import javax.swing.ImageIcon
  18. import java.lang.System
  19. class Example < JFrame
  20. def initialize
  21. super "Simple menu"
  22. self.initUI
  23. end
  24. def initUI
  25. menubar = JMenuBar.new
  26. icon = ImageIcon.new "exit.png"
  27. fileMenu = JMenu.new "File"
  28. fileMenu.setMnemonic KeyEvent::VK_F
  29. itemExit = JMenuItem.new "Exit", icon
  30. itemExit.addActionListener do |e|
  31. System.exit 0
  32. end
  33. itemExit.setMnemonic KeyEvent::VK_C
  34. itemExit.setToolTipText "Exit application"
  35. fileMenu.add itemExit
  36. menubar.add fileMenu
  37. self.setJMenuBar menubar
  38. self.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
  39. self.setSize 250, 200
  40. self.setLocationRelativeTo nil
  41. self.setVisible true
  42. end
  43. end
  44. Example.new

我们的示例将显示一个菜单项。 通过选择退出菜单项,我们关闭应用。

  1. menubar = JMenuBar.new

在这里,我们创建一个菜单栏。

  1. icon = ImageIcon.new "exit.png"

我们将在菜单项中显示一个图标。

  1. fileMenu = JMenu.new "File"
  2. fileMenu.setMnemonic KeyEvent::VK_F

我们创建一个菜单对象。 菜单是包含JMenuItem的弹出窗口。 菜单位于菜单栏上。 也可以通过键盘访问菜单。 要将菜单绑定到特定键,我们使用setMnemonic方法。 在我们的情况下,可以使用ALT + F快捷方式打开菜单。

  1. itemExit = JMenuItem.new "Close", icon
  2. itemExit.addActionListener do |e|
  3. System.exit 0
  4. end

在这里,我们创建一个JMenuItem。 菜单项是显示在所选菜单的弹出窗口中的对象。 我们还为菜单项和工具提示提供了快捷方式。

  1. fileMenu.add itemExit

菜单项被添加到菜单中。

  1. menubar.add fileMenu

菜单添加到菜单栏。

菜单和工具栏 - 图1

图:简单菜单

子菜单

子菜单是插入另一个菜单对象的菜单。 下一个示例对此进行了演示。

  1. #!/usr/local/bin/jruby
  2. # ZetCode JRuby Swing tutorial
  3. #
  4. # This program creates a
  5. # submenu.
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: December 2010
  10. include Java
  11. import java.awt.event.KeyEvent
  12. import java.awt.event.ActionEvent
  13. import javax.swing.JFrame
  14. import javax.swing.ImageIcon
  15. import javax.swing.JMenuBar
  16. import javax.swing.JMenu
  17. import javax.swing.JMenuItem
  18. import javax.swing.KeyStroke
  19. import java.lang.System
  20. class Example < JFrame
  21. def initialize
  22. super "Submenu"
  23. self.initUI
  24. end
  25. def initUI
  26. menubar = JMenuBar.new
  27. iconNew = ImageIcon.new "new.png"
  28. iconOpen = ImageIcon.new "open.png"
  29. iconSave = ImageIcon.new "save.png"
  30. iconExit = ImageIcon.new "exit.png"
  31. fileMenu = JMenu.new "File"
  32. fileMenu.setMnemonic KeyEvent::VK_F
  33. imp = JMenu.new "Import"
  34. imp.setMnemonic KeyEvent::VK_M
  35. newsf = JMenuItem.new "Import newsfeed list..."
  36. bookm = JMenuItem.new "Import bookmarks..."
  37. mail = JMenuItem.new "Import mail..."
  38. imp.add newsf
  39. imp.add bookm
  40. imp.add mail
  41. fileNew = JMenuItem.new "New", iconNew
  42. fileNew.setMnemonic KeyEvent::VK_N
  43. fileOpen = JMenuItem.new "Open", iconOpen
  44. fileNew.setMnemonic KeyEvent::VK_O
  45. fileSave = JMenuItem.new "Save", iconSave
  46. fileSave.setMnemonic KeyEvent::VK_S
  47. fileExit = JMenuItem.new "Exit", iconExit
  48. fileExit.addActionListener do |e|
  49. System.exit 0
  50. end
  51. fileExit.setMnemonic KeyEvent::VK_C
  52. fileExit.setToolTipText "Exit application"
  53. fileExit.setAccelerator KeyStroke.getKeyStroke KeyEvent::VK_W,
  54. ActionEvent::CTRL_MASK
  55. fileMenu.add fileNew
  56. fileMenu.add fileOpen
  57. fileMenu.add fileSave
  58. fileMenu.addSeparator
  59. fileMenu.add imp
  60. fileMenu.addSeparator
  61. fileMenu.add fileExit
  62. menubar.add fileMenu
  63. self.setJMenuBar menubar
  64. self.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
  65. self.setSize 320, 220
  66. self.setLocationRelativeTo nil
  67. self.setVisible true
  68. end
  69. end
  70. Example.new

在示例中,文件菜单的子菜单中有三个选项。

  1. imp = JMenu.new "Import"
  2. ...
  3. fileMenu.add imp

子菜单与其他任何普通菜单一样。 它是用相同的方式创建的。 我们只需将菜单添加到现有菜单即可。

  1. fileExit.setAccelerator KeyStroke.getKeyStroke KeyEvent::VK_W,
  2. ActionEvent::CTRL_MASK

加速器是启动菜单项的快捷键。 在我们的情况下,通过按 Ctrl + W 关闭我们的应用。

  1. fileMenu.addSeparator

分隔符是一条水平线,用于在视觉上分隔菜单项。 这样,我们可以将项目分组到一些合理的位置。

菜单和工具栏 - 图2

图:子菜单

弹出菜单

在下一个示例中,我们创建一个弹出菜单。

  1. #!/usr/local/bin/jruby
  2. # ZetCode JRuby Swing tutorial
  3. #
  4. # This program creates a
  5. # popup menu.
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: December 2010
  10. include Java
  11. import java.awt.event.MouseAdapter
  12. import javax.swing.JFrame
  13. import javax.swing.JPopupMenu
  14. import javax.swing.JMenuItem
  15. import java.lang.System
  16. class MouseAction < MouseAdapter
  17. def mouseReleased e
  18. source = e.source
  19. menu = source.getMenu
  20. if e.getButton == e.button
  21. menu.show e.getComponent, e.getX, e.getY
  22. end
  23. end
  24. end
  25. class Example < JFrame
  26. def initialize
  27. super "Popup menu"
  28. self.initUI
  29. end
  30. def initUI
  31. @menu = JPopupMenu.new
  32. menuItemBeep = JMenuItem.new "Beep"
  33. menuItemBeep.addActionListener do |e|
  34. toolkit = getToolkit
  35. toolkit.beep
  36. end
  37. @menu.add menuItemBeep
  38. menuItemExit = JMenuItem.new "Exit"
  39. menuItemExit.addActionListener do |e|
  40. System.exit 0
  41. end
  42. @menu.add menuItemExit
  43. self.addMouseListener MouseAction.new
  44. self.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
  45. self.setSize 250, 200
  46. self.setLocationRelativeTo nil
  47. self.setVisible true
  48. end
  49. def getMenu
  50. @menu
  51. end
  52. end
  53. Example.new

在我们的示例中,我们创建一个带有两个菜单项的弹出菜单。

  1. @menu = JPopupMenu.new
  2. menuItemBeep = JMenuItem.new "Beep"

我们创建一个弹出菜单和一个菜单项。

  1. self.addMouseListener MouseAction.new

我们将鼠标监听器添加到Example类。 鼠标监听器是MouseAction用户定义的类,该类继承自MouseAdapter。 这是一个便利类,可实现所有五个必需的方法。 方法为空。 除了实现所有五个方法之外,我们仅实现所需的方法。

  1. class MouseAction < MouseAdapter
  2. def mouseReleased e
  3. ...

在我们的MouseAction类中,我们实现了mouseReleased方法。

  1. if e.getButton == e.button:
  2. menu.show e.getComponent, e.getX, e.getY
  3. end

我们在鼠标单击的 x,y 坐标处显示弹出菜单窗口。

菜单和工具栏 - 图3

图:弹出菜单

工具栏

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

  1. #!/usr/local/bin/jruby
  2. # ZetCode JRuby Swing tutorial
  3. #
  4. # This program creates a
  5. # toolbar.
  6. #
  7. # author: Jan Bodnar
  8. # website: www.zetcode.com
  9. # last modified: December 2010
  10. include Java
  11. import java.awt.BorderLayout
  12. import javax.swing.JFrame
  13. import javax.swing.ImageIcon
  14. import javax.swing.JButton
  15. import javax.swing.JMenuBar
  16. import javax.swing.JMenu
  17. import javax.swing.JToolBar
  18. import java.lang.System
  19. class Example < JFrame
  20. def initialize
  21. super "Toolbar"
  22. self.initUI
  23. end
  24. def initUI
  25. menubar = JMenuBar.new
  26. fileMenu = JMenu.new "File"
  27. menubar.add fileMenu
  28. toolbar = JToolBar.new
  29. iconExit = ImageIcon.new "exit2.png"
  30. exitButton = JButton.new iconExit
  31. exitButton.addActionListener do |e|
  32. System.exit 0
  33. end
  34. toolbar.add exitButton
  35. self.add toolbar, BorderLayout::NORTH
  36. self.setJMenuBar menubar
  37. self.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
  38. self.setSize 350, 250
  39. self.setLocationRelativeTo nil
  40. self.setVisible true
  41. end
  42. end
  43. Example.new

该示例创建一个带有一个退出按钮的工具栏。

  1. toolbar = JToolBar.new

工具栏已创建。

  1. exitButton = JButton.new iconExit
  2. ...
  3. toolbar.add exitButton

我们创建一个按钮并将其添加到工具栏。

  1. self.add toolbar, BorderLayout::NORTH

工具栏位于BorderLayout管理器的北部。 BorderLayout管理器是JFrame容器的默认布局管理器。

菜单和工具栏 - 图4

图:工具栏

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