• Java-GUI编程之菜单组件


    前面讲解了如果构建GUI界面,其实就是把一些GUI的组件,按照一定的布局放入到容器中展示就可以了。在实际开发中,除了主界面,还有一类比较重要的内容就是菜单相关组件,可以通过菜单相关组件很方便的使用特定的功能,在AWT中,菜单相关组件的使用和之前学习的组件是一模一样的,只需要把菜单条、菜单、菜单项组合到一起,按照一定的布局,放入到容器中即可。

    下表中给出常见的菜单相关组件:

    菜单组件名称 功能
    MenuBar 菜单条 , 菜单的容器 。
    Menu 菜单组件 , 菜单项的容器 。 它也是Menultem的子类 ,所以可作为菜单项使用
    PopupMenu 上下文菜单组件(右键菜单组件)
    Menultem 菜单项组件 。
    CheckboxMenuItem 复选框菜单项组件

    下图是常见菜单相关组件集成体系图:

    菜单相关组件使用:

    1.准备菜单项组件,这些组件可以是MenuItem及其子类对象

    2.准备菜单组件Menu或者PopupMenu(右击弹出子菜单),把第一步中准备好的菜单项组件添加进来;

    3.准备菜单条组件MenuBar,把第二步中准备好的菜单组件Menu添加进来;

    4.把第三步中准备好的菜单条组件添加到窗口对象中显示。

    小技巧:

    1.如果要在某个菜单的菜单项之间添加分割线,那么只需要调用Menu的add(new MenuItem(-))即可。

    2.如果要给某个菜单项关联快捷键功能,那么只需要在创建菜单项对象时设置即可,例如给菜单项关联 ctrl+shif+/ 快捷键,只需要:new MenuItem("菜单项名字",new MenuShortcut(KeyEvent.VK_Q,true);

    案例1:

    ​ 使用awt中常用菜单组件,完成下图效果

    演示代码1:

    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class SimpleMenu {
        //创建窗口
        private Frame frame = new Frame("这里测试菜单相关组件");
        //创建菜单条组件
        private MenuBar menuBar = new MenuBar();
        //创建文件菜单组件
        private Menu fileMenu = new Menu("文件");
        //创建编辑菜单组件
        private Menu editMenu = new Menu("编辑");
        //创建新建菜单项
        private MenuItem newItem = new MenuItem("新建");
        //创建保存菜单项
        private MenuItem saveItem = new MenuItem("保存");
        //创建退出菜单项
        private MenuItem exitItem = new MenuItem("退出");
    
        //创建自动换行选择框菜单项
        private CheckboxMenuItem autoWrap = new CheckboxMenuItem("自动换行");
    
        //创建复制菜单项
        private MenuItem copyItem = new MenuItem("复制");
    
        //创建粘贴菜单项
        private MenuItem pasteItem = new MenuItem("粘贴");
    
        //创建格式菜单
        private Menu formatMenu = new Menu("格式");
    
        //创建注释菜单项
        private MenuItem commentItem = new MenuItem("注释");
        //创建取消注释菜单项
        private MenuItem cancelItem = new MenuItem("取消注释");
    
        //创建一个文本域
        private TextArea ta = new TextArea(6, 40);
    
        public void init(){
            //定义菜单事件监听器
            ActionListener listener = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    String command = e.getActionCommand();
                    ta.append("单击“"+command+"”菜单\n");
                    if (command.equals("退出")){
                        System.exit(0);
                    }
                }
            };
            //为注释菜单项和退出菜单项注册监听器
            commentItem.addActionListener(listener);
            exitItem.addActionListener(listener);
    
            //为文件菜单fileMenu添加菜单项
            fileMenu.add(newItem);
            fileMenu.add(saveItem);
            fileMenu.add(exitItem);
    
            //为编辑菜单editMenu添加菜单项
            editMenu.add(autoWrap);
            editMenu.add(copyItem);
            editMenu.add(pasteItem);
    
            //为格式化菜单formatMenu添加菜单项
            formatMenu.add(commentItem);
            formatMenu.add(cancelItem);
    
            //将格式化菜单添加到编辑菜单中,作为二级菜单
            editMenu.add(new MenuItem("-"));
            editMenu.add(formatMenu);
    
    
            //将文件菜单和编辑菜单添加到菜单条中
            menuBar.add(fileMenu);
            menuBar.add(editMenu);
    
    
            //把菜单条设置到frame窗口上
            frame.setMenuBar(menuBar);
    
            //把文本域添加到frame中
            frame.add(ta);
    
            //设置frame最佳大小并可见
            frame.pack();
            frame.setVisible(true);
        }
        public static void main(String[] args) {
            new SimpleMenu().init();
        }
    }
    
    

    案例2:

    ​ 通过PopupMenu实现下图效果:

    实现思路:

    1.创建PopubMenu菜单组件;

    2.创建多个MenuItem菜单项,并添加到PopupMenu中;

    3.将PopupMenu添加到目标组件中;

    4.为需要右击出现PopubMenu菜单的组件,注册鼠标监听事件,当监听到用户释放右键时,弹出菜单。

    演示代码2:

    import java.awt.*;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    public class PopupMenuTest {
        private Frame frame = new Frame("这里测试PopupMenu");
        // 创建PopubMenu菜单
        private PopupMenu popupMenu = new PopupMenu();
        // 创建菜单条
        private MenuItem commentItem = new MenuItem("注释");
        private MenuItem cancelItem = new MenuItem("取消注释");
        private MenuItem copyItem = new MenuItem("复制");
        private MenuItem pasteItem = new MenuItem("保存");
        // 创建一个文本域
        private TextArea ta = new TextArea("我爱中华!!!", 6, 40);
        // 创建一个Panel
        private Panel panel = new Panel();
    
        public void init() {
            // 把菜单项添加到PopupMenu中
            popupMenu.add(commentItem);
            popupMenu.add(cancelItem);
            popupMenu.add(copyItem);
            popupMenu.add(pasteItem);
            // 设置panel大小
            panel.setPreferredSize(new Dimension(300, 100));
            // 把PopupMenu添加到panel中
            panel.add(popupMenu);
            // 为panel注册鼠标事件
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseReleased(MouseEvent e) {
                    boolean flag = e.isPopupTrigger();
                    // 判断当前鼠标操作是不是触发PopupMenu的操作
                    if (flag) {
                        // 让PopupMenu显示在panel上,并且跟随鼠标事件发生的地方显示
                        popupMenu.show(panel, e.getX(), e.getY());
                    }
                }
            });
            // 把ta添加到frame中间区域中
    
            frame.add(ta);
    
            // 把panel添加到frame底部
            frame.add(panel, BorderLayout.SOUTH);
    
            // 设置frame最佳大小,并可视;
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            new PopupMenuTest().init();
        }
    
    }
    

    公众号本文地址:https://mp.weixin.qq.com/s/wTmc9O0aDtf_NPSis37-2A

    个人博客:https://kohler19.gitee.io/
    公众号:愚生浅末


    __EOF__

    本文作者愚生浅末
    本文链接https://www.cnblogs.com/kohler21/p/16110753.html
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    【学习笔记】差分约束
    03_学习springdoc与微服务结合_简述
    基于javaweb软件专业介绍管理系统
    LeetCode-409. Longest Palindrome [C++][Java]
    数据结构—排序算法汇总(插入排序,交换排序,选择排序,二路归并排序,基数排序和外部排序)
    python 注解, 装饰器@ 详解
    R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析
    【Java SE】汉诺塔问题
    【图像分类】Vision Transformer理论解读+实践测试
    【C++】面向对象(一)
  • 原文地址:https://www.cnblogs.com/kohler21/p/16110753.html