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 );
}
}
- 运行效果如下: