Swing 高级组件
二、菜单
- 菜单包括菜单栏和弹出式菜单。
1、创建 JMenuBar 菜单栏
- 菜单栏是 Windows 窗体应用程序中常用的一种控件。
1.1、创建基本的菜单
- 位于窗体顶部的菜单栏包括菜单名称、菜单项以及子菜单。
- 创建菜单栏的基本步骤如下:
1)创建菜单栏对象(JMenuBar 类),并添加到窗体的菜单栏中。
2)创建菜单对象(JMenu 类),并将菜单对象添加到菜单栏对象中。
3)创建菜单项对象(JMenuItem 类),并将菜单相项对象添加到菜单对象中。
4)为菜单项添加事件监听器,捕获菜单项被单击的事件,从而完成相应业务逻辑。
5)根据需要在菜单中包含子菜单,即将菜单对象添加到其所属的上级菜单对象中。
6)重复 1)~2)直到在菜单栏中添加完想添加的菜单。
(1)JMenuBar 类
- JMenuBar 类用来创建菜单栏,其常用方法如下表:
方法 说明 add(JMenu c) 用来向菜单栏中添加菜单对象 isSelected() 用来查看菜单栏是否处于被选中的状态,即是否已经选中了菜单栏中的菜单项或子菜单。是则返回 true,反之则返回 false
(2)JMenu 类
- JMenu 类用来创建菜单,菜单用于添加菜单项或子菜单。
- JMenu 类除了默认构造方法外,还有一个用于创建指定名称的菜单的构造方法:JMenu(String s)。
- JMenu 类常用方法如下表:
方法 说明 add(JMenuItem menuItem) 向菜单中添加菜单项和子菜单 add(String s) 向菜单中添加指定名称的菜单项。该方法返回值为添加的菜单项对象,一边对菜单项进行设置 insert(JMenuItem mi, int pos) 向指定位置插入菜单项 insert(String s, int pos) 向指定位置插入指定名称的菜单项,该方法不返回插入的菜单项对象 getMenuCompnentCount() 获得菜单中包含的组件数目,组件包括菜单项、子菜单和分割线 isTopLevelMenu() 查看菜单是否为顶层菜单,即是否为添加到菜单栏对象中的菜单对象,是则返回 true,反之则返回 false isMenuComponent(Component c) 查看指定菜单项或子菜单是否包含在该菜单中
(3)JMenuItem 类
- JMenuItem 类用来创建菜单项,单击菜单项时就会触发一个动作事件,而通过捕获该事件,可以完成菜单项的对应的业务逻辑。
1.2、创建简单菜单栏实例
- 创建一个简单的菜单栏实例,源代码如下:
package 高级Swing组件; // !/usr/bin/env jdk1.8 // encoding:utf-8 //@software:IntelliJ IDEA //@pack:高级Swing组件 //@user:彭友聪 //@date:2019/08/06 //@time:下午 3:17 //@project:IDEA_JAVA //@file:JMenuTest.java //Author:御承扬 //email:2923616405@qq.com import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class JMenuTest extends JFrame { private static final long serialVersionUID = 1L; private JMenuTest(){ super(); setTitle( "菜单栏示例" ); setBounds( 100,100,500,375 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); JMenuBar menuBar = new JMenuBar(); // 创建菜单栏对象 setJMenuBar( menuBar ); // 添加菜单栏对象到窗体中 JMenu menu = new JMenu("菜单名称");// 创建菜单对象 menuBar.add(menu);// 将菜单对象添加到菜单栏对象中 JMenuItem menuItem = new JMenuItem("菜单项名称");// 创建菜单项对象 menuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器 menu.add(menuItem);// 将菜单项对象添加到菜单对象中 JMenu sonMenu = new JMenu("子菜单名称");// 创建菜单的子菜单对象 menu.add(sonMenu);// 将子菜单对象添加到上级菜单对象中 JMenuItem sonMenuItem = new JMenuItem("子菜单项名称");// 创建子菜单的菜单项对象 sonMenuItem.addActionListener(new ItemListener());// 为菜单项添加事件监听器 sonMenu.add(sonMenuItem);// 将子菜单的菜单项对象添加到子菜单对象中 JMenu menu2 = new JMenu("菜单名称2");// 创建菜单对象 menuBar.add(menu2);// 将菜单对象添加到菜单栏对象中 JMenuItem menuItem2 = new JMenuItem("菜单项名称2");// 创建菜单项对象 menuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器 menu2.add(menuItem2);// 将菜单项对象添加到菜单对象中 JMenu sonMenu2 = new JMenu("子菜单名称2");// 创建菜单的子菜单对象 menu2.add(sonMenu2);// 将子菜单对象添加到上级菜单对象中 JMenuItem sonMenuItem2 = new JMenuItem("子菜单项名称2");// 创建子菜单的菜单项对象 sonMenuItem2.addActionListener(new ItemListener());// 为菜单项添加事件监听器 sonMenu2.add(sonMenuItem2);// 将子菜单的菜单项对象添加到子菜单对象中 } private class ItemListener implements ActionListener { private ItemListener() { } public final void actionPerformed(ActionEvent e) { JMenuItem menuItem = (JMenuItem) e.getSource();// 获得触发此次事件的菜单项 System.out.println("您单击的是菜单项:" + menuItem.getText());// 获取菜单项文本 } } public static void main(String[] args) { JMenuTest frame = new JMenuTest(); frame.setVisible(true); } }
- 运行如下图:
- 控制台输出:
您单击的是菜单项:子菜单项名称 您单击的是菜单项:菜单项名称 您单击的是菜单项:菜单项名称2 您单击的是菜单项:子菜单项名称2
1.3、常用菜单设置
(1)为菜单添加分割线
- 菜单栏中,往往功能相似或相关的菜单项放在一起,并使用分隔线与其他菜单项区别开来,Swing 中使用 JMenu 类的 addSeparator() 方法和 insertSeparator(int index) 方法来添加分隔线,具体用法如下:
addSeparator():用来向菜单的尾部添加分隔线。
insertSeparator(int index):用来向指定索引位置插入分隔线。
(2)为菜单添加图标
- 菜单和菜单项支持添加图标,通过方法 setIcon(Icon defaultIcon) 方法设置。
(3)为菜单设置快捷键
- 菜单和菜单项支持快捷键设置,通过方法 setMnemonic(int mnemonic)实现,该方法的入口参数为与键盘助记符对应的键值,可以通过 java.awt.event.KeyEvent 类中定义的以“VK_”开头的静态常量指定;快捷键不区分大小写。
1.4、常用菜单设置示例
- 该实例演示菜单的常用设置,代码如下:
// !/usr/bin/env jdk1.8 // encoding:utf-8 //@software:IntelliJ IDEA //@pack:高级Swing组件 //@user:彭友聪 //@date:2019/08/06 //@time:下午 7:09 //@project:IDEA_JAVA //@file:CustomMenuTest.java //Author:御承扬 //email:2923616405@qq.com import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.net.URL; public class CustomMenuTest extends JFrame { public static void main(String[] args) { CustomMenuTest frame = new CustomMenuTest(); frame.setVisible( true ); } private CustomMenuTest() { super(); setBounds( 100, 100, 500, 375 ); setTitle( "个性化菜单示例" ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); final JMenuBar menuBar = new JMenuBar(); setJMenuBar( menuBar ); final JMenu fileMenu = new JMenu( "文件(F)" ); // 文件菜单 fileMenu.setMnemonic( KeyEvent.VK_F ); // 设置快捷键 menuBar.add(fileMenu); // 将菜单添加到菜单栏中 final JMenuItem newItem = new JMenuItem( "新建(N)" ); newItem.setMnemonic( KeyEvent.VK_N ); newItem.addActionListener( new ItemListener() ); fileMenu.add( newItem ); final JMenuItem openMenu = new JMenuItem( "打开(O)" ); openMenu.setMnemonic( KeyEvent.VK_O ); fileMenu.add(openMenu); // 创建子菜单项 final JMenuItem openNewItem = new JMenuItem( "未打开过的(N)" ); openNewItem.setMnemonic( KeyEvent.VK_N ); openNewItem.addActionListener( new ItemListener() ); openMenu.add(openNewItem); final JMenuItem openClosedItem = new JMenuItem( "刚打开过的(C)" ); openClosedItem.setMnemonic( KeyEvent.VK_C ); openClosedItem.setEnabled( false ); // 禁用菜单项 openClosedItem.addActionListener( new ItemListener() ); openMenu.add(openClosedItem); fileMenu.addSeparator(); // 添加分隔线 final JMenuItem saveItem = new JMenuItem( ); saveItem.setText( "保存(S)" ); saveItem.setMnemonic( KeyEvent.VK_S ); saveItem.addActionListener( new ItemListener() ); fileMenu.add(saveItem); fileMenu.addSeparator(); final JMenuItem exitItem = new JMenuItem( ); exitItem.setText( "退出(E)" ); exitItem.setMnemonic( KeyEvent.VK_E ); exitItem.addActionListener( new ItemListener() ); fileMenu.add(exitItem); final JMenu editMenu = new JMenu( ); editMenu.setText( "编辑(E)" ); editMenu.setMnemonic( KeyEvent.VK_E ); menuBar.add(editMenu); URL resource = this.getClass().getResource( "java3.jpg" ); ImageIcon icon = new ImageIcon( resource ); final JMenuItem cutItem = new JMenuItem( "剪切(T)" ); cutItem.setIcon( icon ); // 设置图标 cutItem.setMnemonic( KeyEvent.VK_T ); cutItem.addActionListener( new ItemListener() ); editMenu.add(cutItem); final JMenuItem copyItem = new JMenuItem( "复制(C)" ); copyItem.setIcon( icon ); copyItem.setMnemonic( KeyEvent.VK_C ); copyItem.addActionListener( new ItemListener() ); editMenu.add(copyItem); final JMenuItem pasteItem = new JMenuItem( "粘贴(P)" ); pasteItem.setIcon( icon ); pasteItem.setMnemonic( KeyEvent.VK_P ); pasteItem.addActionListener( new ItemListener() ); editMenu.add(pasteItem); editMenu.insertSeparator( 2 ); // 插入分隔线 final JMenu helpMenu = new JMenu( "帮助(H)", false ); helpMenu.setMnemonic( KeyEvent.VK_H ); menuBar.add(helpMenu); final JMenuItem aboutItem = new JMenuItem( "关于(A)" ); aboutItem.setMnemonic( KeyEvent.VK_A ); aboutItem.addActionListener( new ItemListener() ); helpMenu.add(aboutItem); } private static class ItemListener implements ActionListener { private ItemListener() { } public final void actionPerformed(ActionEvent e){ JMenuItem menuItem = (JMenuItem)e.getSource(); // 获取单击的菜单项 System.out.println( "你单击的菜单项:"+menuItem.getText() ); // 显示单击菜单项的文本 } } }
- 运行效果如下图:
- 控制台输出
你单击的菜单项:新建(N) 你单击的菜单项:剪切(T) 你单击的菜单项:复制(C) 你单击的菜单项:粘贴(P) 你单击的菜单项:关于(A)
2、弹出式菜单
2.1、创建 JPopupMenu 弹出式菜单
- 创建弹出式菜单和创建菜单栏的步奏基本相似,只需第一个的创建菜单栏对象改成创建弹出式菜单(JPopupMenu)对象,然后添加菜单项,为菜单添加鼠标事件监听器,在捕获弹出菜单事件时弹出该菜单。
2.2、JPopupMenu 简单示例
- 示例代码如下:
package 高级Swing组件; // !/usr/bin/env jdk1.8 // encoding:utf-8 //@software:IntelliJ IDEA //@pack:高级Swing组件 //@user:彭友聪 //@date:2019/08/07 //@time:上午 9:02 //@project:IDEA_JAVA //@file:JPopupMenuTest.java //Author:御承扬 //email:2923616405@qq.com import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class JPopupMenuTest extends JFrame { private static final long serialVersionUID = 1L; private static class ItemListener implements ActionListener { private ItemListener() { } public final void actionPerformed(ActionEvent e) { JMenuItem menuItem = (JMenuItem) e.getSource(); System.out.println( "被单击的菜单项是:"+menuItem.getText() ); } } private JPopupMenuTest() { super(); setTitle( "弹出菜单示例" ); setBounds( 100,100,500,375 ); setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); final JLabel label = new JLabel( ); label.setText( " 请在窗口中单击鼠标右键!" ); getContentPane().add(label, BorderLayout.CENTER ); final JPopupMenu popupMenu = new JPopupMenu( ); // 创建弹出式菜单 // 为窗体的顶层容器添加鼠标事件监听器 getContentPane().addMouseListener( new MouseAdapter() { // 鼠标按键被释放时触发该方法 @Override public void mouseReleased(MouseEvent e) { // 判断此次鼠标事件是否为该组件的弹出菜单触发事件 // 如果是则在释放鼠标的位置弹出菜单 if(e.isPopupTrigger()) popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } ); final JMenuItem cutItem = new JMenuItem("剪切"); cutItem.addActionListener(new ItemListener()); popupMenu.add(cutItem); final JMenuItem copyItem = new JMenuItem("复制"); copyItem.addActionListener(new ItemListener()); popupMenu.add(copyItem); final JMenuItem pastItem = new JMenuItem("粘贴"); pastItem.addActionListener(new ItemListener()); popupMenu.add(pastItem); final JMenu editMenu = new JMenu("编辑"); popupMenu.add(editMenu); final JMenuItem readItem = new JMenuItem("只读"); readItem.addActionListener(new ItemListener()); editMenu.add(readItem); final JMenuItem writeItem = new JMenuItem("可写"); writeItem.addActionListener(new ItemListener()); editMenu.add(writeItem); final JMenu fontMenu = new JMenu("字体"); editMenu.add(fontMenu); final JMenuItem boldfacedItem = new JMenuItem("加粗"); boldfacedItem.addActionListener(new ItemListener()); fontMenu.add(boldfacedItem); final JMenuItem italicItem = new JMenuItem("斜体"); italicItem.addActionListener(new ItemListener()); fontMenu.add(italicItem); } public static void main(String[] args) { JPopupMenuTest frame = new JPopupMenuTest(); frame.setVisible( true ); } }
- 运行效果如下: