Swing--JMenu和JPopupMenu:菜单和弹出式菜单

24 篇文章 0 订阅

菜单由 Swing 中的 JMenu 类实现,可以包含多个菜单项和带分隔符的菜单。在菜单中,菜单项由 JMenuItem 类表示,分隔符由 JSeparator 类表示。

菜单本质上是带有关联 JPopupMenu 的按钮。当按下“按钮”时,就会显示 JPopupMenu。如果“按钮”位于 JMenuBar 上,则该菜单为顶层窗口。如果“按钮”是另一个菜单项,则 JPopupMenu 就是“下拉”菜单。

JMenu构造方法

  • JMenu():创建一个无文本的JMenu对象
  • JMenu(String s):创建一个带有指定文本的JMenu对象

JMenu常用方法
在这里插入图片描述
菜单如果依附到 JMenuBar 对象上,则此菜单就是菜单栏中的菜单。菜单如果依附在 JPopupMenu 对象上,此菜单就是弹出式菜单
Demo

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

public class DemoMenu {
    public static JMenu createMenu01() {
        JMenu jMenu = new JMenu("文件(F)");
        //设置快速访问符
        jMenu.setMnemonic(KeyEvent.VK_F);
        //设置快速访问符和键盘助记符
        JMenuItem jMenuItem01 = new JMenuItem("新建(N)", KeyEvent.VK_N);
        jMenuItem01.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.CTRL_MASK));
        jMenu.add(jMenuItem01);

        JMenuItem jMenuItem02 = new JMenuItem("打开(O)", KeyEvent.VK_O);
        jMenuItem02.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
        jMenu.add(jMenuItem02);

        JMenuItem jMenuItem03 = new JMenuItem("保存(S)", KeyEvent.VK_S);
        jMenuItem03.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
        jMenu.add(jMenuItem03);
        //设置菜单分隔符
        jMenu.addSeparator();
        JMenuItem jMenuItem04 = new JMenuItem("退出(E)", KeyEvent.VK_E);
        jMenuItem04.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.CTRL_MASK));
        jMenu.add(jMenuItem04);
        //将子菜单添加进主菜单
        return jMenu;
    }

    public static JMenu createMenu02() {
        JMenu jMenu = new JMenu("编辑(E)");
        jMenu.setMnemonic(KeyEvent.VK_E);

        JMenuItem jMenuItem01 = new JMenuItem("撤销(U)",KeyEvent.VK_U);
        //设置菜单不可用
        jMenuItem01.setEnabled(false);
        jMenu.add(jMenuItem01);
        //设置菜单分割符
        jMenu.addSeparator();
        JMenuItem jMenuItem02 = new JMenuItem("剪贴(T)",KeyEvent.VK_T);
        jMenu.add(jMenuItem02);
        JMenuItem jMenuItem03 = new JMenuItem("复制(C)",KeyEvent.VK_C);
        jMenu.add(jMenuItem03);
        //设置菜单分割符
        jMenu.addSeparator();
        JCheckBoxMenuItem jCheckBoxMenuItem = new JCheckBoxMenuItem("自动换行");
        jMenu.add(jCheckBoxMenuItem);
        //返回JMenu对象
        return jMenu;
    }

    public static void setUp() {
        //设置窗体
        JFrame jFrame = new JFrame("菜单示例");
        //创建JMe木Bar对象,将菜单添加进去
        JMenuBar jMenuBar = new JMenuBar();
        //添加文件菜单
        jMenuBar.add(createMenu01());
        //添加编辑菜单
        jMenuBar.add(createMenu02());
        jFrame.setJMenuBar(jMenuBar);
        //设置窗体基本信息
        jFrame.setVisible(true);
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        setUp();
    }
}

Demo运行结果如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述代码调用 JMenu 对象的 setMnemonic() 方法设置当前菜单的快速访问符。该符号必须对应键盘上的一个键,并且应该使用 java.awt.event.KeyEvent 中定义的 VK—XXX 键代码之一指定。

提示:快速访问符是一种快捷键,通常在按下 Alt 键和某个字母时激活。例如,常用的 Alt+F 是“文件” 菜单的快速访问符。

JMenuItem 类实现的是菜单中的菜单项。菜单项本质上是位于列表中的按钮。当用户单击“按钮”时,则执行与菜单项关联的操作。JMenuItem 的常用构造方法有以下三个。
JMenuItem(String text):创建带有指定文本的 JMenuItem。
JMenuItem(String text,Icon icon):创建带有指定文本和图标的 JMenuItem。
JMenuItem(String text,int mnemonic):创建带有指定文本和键盘助记符的 JMenuItem。

在该实例中,创建菜单项后调用 JMenuItem 对象的 setAccelerator(KeyStroke) 方法来设置修改键,它能直接调用菜单项的操作监听器而不必显示菜单的层次结构。在本实例中没有实现事件监听机制,所以使用快捷键时将得不到程序的任何响应,但是在菜单项中将出现快捷键。

弹出式菜单
弹出式菜单由 JPopupMenu 类实现,它是一个可弹出并显示一系列选项的小窗口。它还用于当用户选择菜单项并激活它时显示的“右拉式(pull-right)”菜单,可以在想让菜单显示的任何其他位置使用。例如,当用户在指定区域中右击时
在这里插入图片描述
Demo02

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Demo {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("弹出式菜单");
        JPopupMenu jPopupMenu = new JPopupMenu();
        JMenu jMenu01= new JMenu("文件");

        JMenuItem jMenuItem01 = new JMenuItem("打开");
        JMenuItem jMenuItem02 = new JMenuItem("关闭");

        jMenu01.add(jMenuItem01);
        jMenu01.add(jMenuItem02);

        jPopupMenu.add(jMenu01);
        jPopupMenu.addSeparator();

        JRadioButtonMenuItem jRadioButtonMenuItem01 = new JRadioButtonMenuItem("复制");
        JRadioButtonMenuItem jRadioButtonMenuItem02 = new JRadioButtonMenuItem("粘贴 ");
        ButtonGroup buttonGroup = new ButtonGroup();

        buttonGroup.add(jRadioButtonMenuItem01);
        buttonGroup.add(jRadioButtonMenuItem02);
        jPopupMenu.add(jRadioButtonMenuItem01);
        jPopupMenu.add(jRadioButtonMenuItem02);

        jPopupMenu.addSeparator();
        JMenu jMenu02  = new JMenu("退出");
        jPopupMenu.add(jMenu02);
        MouseListener mouseListener = new PopupListener(jPopupMenu);


        jFrame.addMouseListener(mouseListener);
        jFrame.setVisible(true);
        jFrame.setSize(400, 300);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
class  PopupListener extends MouseAdapter
{
    JPopupMenu popupMenu;
    PopupListener(JPopupMenu popupMenu)
    {
        this.popupMenu=popupMenu;
    }
    public void mousePressed(MouseEvent e)
    {
        showPopupMenu(e);
    }
    public void mouseReleased(MouseEvent e)
    {
        showPopupMenu(e);
    }
    private void showPopupMenu(MouseEvent e)
    {
        if(e.isPopupTrigger())
        {
            //如果当前事件与鼠标事件相关,则弹出菜单
            popupMenu.show(e.getComponent(),e.getX(),e.getY());
        }
    }
}

Demo02运行结果如下
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值