文章目录
组件详解菜单组件JMenu、JMenuItem 等常用方法下拉式菜单:JMenu、JMenuItem弹出式菜单:JPopupMenu复选框和单选按钮菜单项键盘助记符和加速器启用和禁用菜单项
组件详解
菜单组件
JMenu、JMenuItem 等常用方法
javax.swing.JMenu:
// 用给定标签构造一个菜单JMenu(String label)// 添加一个菜单项(或一个菜单)JMenuItem add(JMenuItem item)// 将一个有给定标签的菜单项添加到菜单中,并返回这个菜单项JMenuItem add(String label)// 将一个有给定动作的菜单项添加到菜单中,并返回这个菜单项JMenuItem add(Action a)// 将一个分隔行添加到菜单中void addSeparator()// 将一个分隔符添加到菜单中void insertSeparator(int index)// 将一个新菜单项(或子菜单)添加到菜单的指定索引位置JMenuItem insert(JMenuItem menu, int index)// 将有指定动作的新菜单项增加到菜单的指定索引位置JMunuItem insert(Action a, int index)// 从菜单中删除指定的菜单项void remove(int index)void remove(JMenuItem item)
javax.swing.JMenuItem extends AbstractButton:
// 用给定标签构造一个菜单项JmenuItem(String label)// 为给定动作构造一个菜单项JMenuItem(Action a)// 用给定的标签和图标构造一个菜单项JMenuItem(String label, Icon icon)
javax.swing.AbstractButton:
// 设置动作void setAction(Action a)// 指定一个图标void setIcon(Icon icon)// 设置文本相对于图标的水平位置。pos参数是SwingConstants.RIGHT(文本在图标的右侧)或SwingConstants.LEFTvoid setHorizontalTextPosition(int pos)
javax.swing.JFrame:
// 为这个窗体设置菜单栏void setJMenuBar(JMenuBar memubar)
下拉式菜单:JMenu、JMenuItem
位于窗口顶部的莱单栏(menu bar)包括了下拉菜单的名字。点击一个名字就可以打开包含菜单项(menu item)和子菜单(submenu)的菜单。当用户点击菜单项时,所有的菜单都会被关闭并且将一条消息发送给程序。
菜单栏是一个可以添加到任何位置的组件,常放置在窗体的顶部
可以调用 Frame 类的 setJMenuBar() 方法将菜单栏添加到窗体的顶部
代码示例
// 创建菜单栏JMenuBar menuBar = new JMenuBar();// 创建一个菜单对象JMenu editMenu = new JMenu("Edit");// 将菜单添加到菜单栏中menuBar.add(editMenu);// 向菜单对象中添加菜单项JMenuItem pasteItem = new JMenuItem("Paste");editMenu.add(pasteItem);// 快捷形式:JMenuItem pasteItem = editMenu.add("Paste");// 向菜单对象中添加分隔符和子菜单editMenu.addSeparator();// 向菜单对象中添加子菜单JMenu optionsMenu = new JMenu("submenu");editMenu.add(optionsMenu);// 当用户选择菜单时,将触发一个动作事件。需要为每个菜单项安装一个动作监听器pasteItem.addActionListener(e -> {});
弹出式菜单:JPopupMenu
弹出式菜单(pop-up menu):也称快捷菜单,是不固定在菜单栏中,可以附加在任何组件上使用
当在附有快捷菜单的组件上右击时,即显示出快捷菜单。例如,鼠标右键菜单
javax.swing.JPopupMenu extends JComponent:
// 在组件c上显示弹出菜单,组件c的左上角坐标为(x,y)(c的坐标空间内)void show(Component c, int x, int y)// 如果鼠标事件是弹出菜单触发器,则返回trueboolean isPopupTrigger(MouseEvent event)
java.awt.event.MouseEvent:
// 如果鼠标事件是弹出菜单触发器,则返回trueboolean isPopupTrigger()
javax.swing.JComponent:
// 获取或设置用于这个组件的弹出菜单JPopupMenu getComponentPopupMenu()void setComponentPopupMenu(JPopupMenu popup)// 获取或设置inheritsPopupMenu属性。如果这个特性已设置或这个组件的弹出菜单为null,就使用其父组件的弹出菜单boolean getInheritsPopupMenu()void setInheritsPopupMenu(boolean b)
复选框和单选按钮菜单项
复选框和单选按钮菜单项会在菜单名旁边显示一个复选框或一个单选按钮。
当用户选择一个菜单项时,菜单项就会自动地在选择和未选择间进行切换。
除了按钮装饰外,复选框和单选按钮菜单项同其他菜单项的处理一样。
单选按钮菜单项与普通单选按钮的工作方式一样,必须将它们加入到按钮组中。当按钮组中的一个按钮被选中时,其他按钮都自动地变为未选中。
javax.swing.JCheckBoxMenuItem:
// 用给定的标签构造一个复选框菜单项JCheckBoxMenuItem(String label)// 用给定的标签和给定的初始状态(true为选定)构造一个复选框菜单JCheckBoxMenuItem(String label, boolean state)
javax.swing.JRadioButtonMenuItem extends AbstractButton:
// 用给定的标签构造一个单选按钮菜单项JRadioButtonMenuItem(String label)// 用给定的标签和给定的初始状态(true为选定)构造一个单选按钮菜单项JRadioButtonMenuItem(String label, boolean state)
javax.swing.AbstractButton:
// 获取或设置这个菜单项的选择状态(true为选中)boolean isSelected()void setSelected(boolean state)
代码示例:
// 创建复选框菜单项JCheckBoxMenuItem readonlyItem = new JCheckBoxMenuItem("Read-only");optionsMenu.add(readonlyItem);// 创建单选按钮菜单项ButtonGroup group = new ButtonGroup();JRadioButtonMenuItem insertItem = new JRadioButtonMenuItem("Insert");insertItem.setSelected(true);JRadioButtonMenuItem overtypeItem = new JRadioButtonMenuItem("Overtype");group.add(insertItem);group.add(overtypeItem);optionsMenu.add(insertItem)optionsMenu.add(overtypeItem);
键盘助记符和加速器
对于有经验的用户来说,通过键盘助记符选择菜单项确实非常便捷。
可以通过在菜单项的构造器中指定一个助记字母来为菜单项设置键盘助记符
键盘助记符会在菜单中自动显示,助记字母下面有一条下划线。
例如,菜单项中的标签显示为“About”,字母A带有一个下划线。菜单显示时,用户只需要按下“A”键就可以选择这个菜单项(如果助记字母不在菜单字符串中,同样可以按下这个字母选择菜单项,不过助记符不会在菜单中,同样可以按下这个字母选择菜单项,不过助记符不会在菜单中显示。
javax.swing.JMenuItem extends AbstractButton:
// 用给定的标签和助记符构造一个菜单项JMenuItem(String label,int mnemonic)// 将k键设置为这个菜单项的加速器。加速器键显示在标签旁边void setAccelerator(KeyStroke k)
javax.swing.AbstractButton:
// 设置按钮的助记字符。该字符会在标签中加下划线显示void setMnemonic(int mnemonic)// 设置按钮文本中加下划线字符的索引。如果不希望第一个出现的助记字符带下划线,就可以使用这个方法void setDisplayedMnemonicIndex(int index)
代码示例
var aboutItem = new JMenuItem("About",'A');
启用和禁用菜单项
有些时候,某个特定的菜单项可能只在某种特定的环境下才能选择。
例如,当文档以只读方式打开时,Save菜单项就没有意义。当然,可以使用 JMenu.remove()
方法将这个菜单项从菜单中删掉,但用户会对内容不断变化的菜单感到奇怪。实际上,最好禁用这个菜单项,以免触发暂时不适用的命令。被禁用的菜单项显示为灰色,不允许选择。
javax.swing.JMenuItem:
// 启用或禁用菜单项void setEnabled(boolean b)
javax.swing.event.MenuListener:
// 在菜单被选择但尚未打开时调用void menuSelected(MenuEvent e)// 在菜单被取消选择并且已经关闭之后调用void menuDeselected(MenuEvent e)// 当菜单被取消时调用。例如,用户点击菜单以外的区域void menuCanceled(MenuEvent e)
启用和禁用菜单项有两种策略:
策略1:每次环境发生变化时,就对相关的菜单项或动作调用 setEnabled() 方法
例如:一旦文档以只读方式打开,可以找到并禁用 “Save” 和 “Save As” 菜单项。
策略2:在显示菜单之前禁用这些菜单项
为此,必须为“菜单选中”事件注册一个监听器。
menuSelected()
方法在菜单显示之前调用,所以可以用这个方法禁用或启用菜单项。
下面的代码显示了选中只读复选框菜单项时如何禁用Save和Save As动作。
public void menuSelected(MenuEvent event) {saveAction.setEnabled(!readonlyItem.isSelected());saveAsAction.setEnabled(!readonlyItem.isSelected());}