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


 

JAVA窗体中添加文本框 java在窗体上添加菜单栏_菜单项