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

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

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

简单菜单

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

  1. #!/usr/local/bin/jython
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode Jython Swing tutorial
  5. This program creates a simple
  6. menu.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: November 2010
  10. """
  11. from java.awt.event import KeyEvent
  12. from java.lang import System
  13. from javax.swing import ImageIcon
  14. from javax.swing import JFrame
  15. from javax.swing import JMenu
  16. from javax.swing import JMenuBar
  17. from javax.swing import JMenuItem
  18. class Example(JFrame):
  19. def __init__(self):
  20. super(Example, self).__init__()
  21. self.initUI()
  22. def initUI(self):
  23. menubar = JMenuBar()
  24. icon = ImageIcon("exit.png")
  25. file = JMenu("File")
  26. file.setMnemonic(KeyEvent.VK_F)
  27. fileExit = JMenuItem("Exit", icon,
  28. actionPerformed=self.onSelect)
  29. fileExit.setMnemonic(KeyEvent.VK_C)
  30. fileExit.setToolTipText("Exit application")
  31. file.add(fileExit)
  32. menubar.add(file)
  33. self.setJMenuBar(menubar)
  34. self.setTitle("Simple menu")
  35. self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  36. self.setSize(250, 200)
  37. self.setLocationRelativeTo(None)
  38. self.setVisible(True)
  39. def onSelect(self, e):
  40. System.exit(0)
  41. if __name__ == '__main__':
  42. Example()

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

  1. menubar = JMenuBar()

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

  1. icon = ImageIcon("exit.png")

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

  1. file = JMenu("File")
  2. file.setMnemonic(KeyEvent.VK_F)

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

  1. fileExit = JMenuItem("Exit", icon,
  2. actionPerformed=self.onSelect)
  3. fileExit.setMnemonic(KeyEvent.VK_C)
  4. fileExit.setToolTipText("Exit application")

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

  1. file.add(fileExit)

菜单项被添加到菜单中。

  1. menubar.add(file)

菜单添加到菜单栏。

Jython Swing 中的菜单和工具栏 - 图1

图:简单菜单

子菜单

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

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

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

  1. imp = JMenu("Import")
  2. ...
  3. file.add(imp)

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

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

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

  1. file.addSeparator()

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

Jython Swing 中的菜单和工具栏 - 图2

图:子菜单

弹出菜单

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

  1. #!/usr/local/bin/jython
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode Jython Swing tutorial
  5. This program creates a popup menu.
  6. author: Jan Bodnar
  7. website: www.zetcode.com
  8. last modified: November 2010
  9. """
  10. from java.awt.event import MouseListener
  11. from java.lang import System
  12. from javax.swing import JFrame
  13. from javax.swing import JMenuItem
  14. from javax.swing import JPopupMenu
  15. class Example(JFrame, MouseListener):
  16. def __init__(self):
  17. super(Example, self).__init__()
  18. self.initUI()
  19. def initUI(self):
  20. self.menu = JPopupMenu()
  21. menuItemBeep = JMenuItem("Beep", actionPerformed=self.onBeep)
  22. self.menu.add(menuItemBeep)
  23. menuItemClose = JMenuItem("Exit", actionPerformed=self.onExit)
  24. self.menu.add(menuItemClose);
  25. self.addMouseListener(self)
  26. self.setTitle("Popup menu")
  27. self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  28. self.setSize(250, 200)
  29. self.setLocationRelativeTo(None)
  30. self.setVisible(True)
  31. def mouseReleased(self, e):
  32. if e.getButton() == e.BUTTON3:
  33. self.menu.show(e.getComponent(), e.getX(), e.getY())
  34. def onExit(self, e):
  35. System.exit(0)
  36. def onBeep(self, e):
  37. toolkit = self.getToolkit()
  38. toolkit.beep()
  39. if __name__ == '__main__':
  40. Example()

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

  1. self.menu = JPopupMenu()
  2. menuItemBeep = JMenuItem("Beep", actionPerformed=self.onBeep)

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

  1. def mouseReleased(self, e):
  2. if e.getButton() == e.BUTTON3:
  3. self.menu.show(e.getComponent(), e.getX(), e.getY())

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

Jython Swing 中的菜单和工具栏 - 图3

图:弹出菜单

工具栏

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

  1. #!/usr/local/bin/jython
  2. # -*- coding: utf-8 -*-
  3. """
  4. ZetCode Jython Swing tutorial
  5. In this program, we create a simple
  6. toolbar.
  7. author: Jan Bodnar
  8. website: www.zetcode.com
  9. last modified: November 2010
  10. """
  11. from java.awt import BorderLayout
  12. from java.lang import System
  13. from javax.swing import ImageIcon
  14. from javax.swing import JFrame
  15. from javax.swing import JMenu
  16. from javax.swing import JMenuBar
  17. from javax.swing import JToolBar
  18. from javax.swing import JButton
  19. class Example(JFrame):
  20. def __init__(self):
  21. super(Example, self).__init__()
  22. self.initUI()
  23. def initUI(self):
  24. menubar = JMenuBar()
  25. file = JMenu("File")
  26. menubar.add(file)
  27. self.setJMenuBar(menubar)
  28. toolbar = JToolBar()
  29. icon = ImageIcon("exit.png")
  30. exitButton = JButton(icon, actionPerformed=self.onClick)
  31. toolbar.add(exitButton)
  32. self.add(toolbar, BorderLayout.NORTH)
  33. self.setTitle("Toolbar")
  34. self.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
  35. self.setSize(350, 250)
  36. self.setLocationRelativeTo(None)
  37. self.setVisible(True)
  38. def onClick(self, e):
  39. System.exit(0)
  40. if __name__ == '__main__':
  41. Example()

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

  1. toolbar = JToolBar()

工具栏已创建。

  1. exitButton = JButton(icon, actionPerformed=self.onClick)
  2. toolbar.add(exitButton)

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

  1. self.add(toolbar, BorderLayout.NORTH)

工具栏位于BorderLayout管理器的北部。

Jython Swing 中的菜单和工具栏 - 图4

图:工具栏

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