【Java-GUI】04 菜单

——1、菜单组件

相关对象:

MenuBar 菜单条
Menu 菜单容器
PopupMenu 上下文菜单(右键弹出菜单组件)
MenuItem 菜单项
CheckboxMenuItem 复选框菜单项

小技巧:

1、添加这样的菜单项分割线可以直接调用add(new MenuItem("-"))实现

2、给某一个菜单项绑定快捷键,调用 new MenuItem("菜单项名称",new MenuShortcut(KeyEvent.枚举按键值,true))

案例:

package cn.dzz;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main {
    public static void main(String[] args) {
        // 创建窗体
        Frame frame = new Frame();
        
        // 先把界面需要的组件创建出来
        MenuBar menuBar = new MenuBar();

        Menu fileMenu = new Menu("file");
        Menu editMenu = new Menu("edit");
        // 格式菜单嵌入在编辑菜单对象中
        Menu formatMenu = new Menu("Format");

        // 菜单项
        MenuItem autoNextLineMenuItem = new MenuItem("autoNextLine");
        MenuItem copyMenuItem = new MenuItem("copy");
        MenuItem pasteMenuItem = new MenuItem("paste");

        MenuItem commentMenuItem = new MenuItem("comment Ctrl + Shift + Q");
        MenuItem cancelCommentMenuItem = new MenuItem("comment cancel");

        // 别漏了文本编辑区
        TextArea textArea = new TextArea(6,40);

        // 事件交互处理
        commentMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.append("您点击了菜单项:" + e.getActionCommand());
            }
        });

        // 先从小的组件开始组装到一起

        // 格式菜单装上注释和取消注释
        formatMenu.add(commentMenuItem);
        formatMenu.add(cancelCommentMenuItem);
        // 再组装编辑菜单
        editMenu.add(autoNextLineMenuItem);
        editMenu.add(copyMenuItem);
        editMenu.add(pasteMenuItem);
        editMenu.add(new MenuItem("-")); // 菜单分割线
        editMenu.add(formatMenu);

        // 再是菜单条添加菜单对象
        menuBar.add(fileMenu);
        menuBar.add(editMenu);
        
        // 总体布局确定
        frame.setMenuBar(menuBar);
        frame.add(textArea);

        frame.pack();
        frame.setVisible(true);
    }
}

效果还不错:

设置的菜单:

多点击几次之后发现没有换行,需要加上\n换行字符

textArea.append("您点击了菜单项:" + e.getActionCommand() + "\n");

弹出式菜单对象 PopupMenu

案例:

package cn.dzz;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main {


    public static void main(String[] args) {
        // 创建窗体
        Frame frame = new Frame();

        // 先创建组件,之后进行布局设置
        TextArea textArea = new TextArea("demo text 文本内容",6, 40);
        Panel panel = new Panel();
        panel.setPreferredSize(new Dimension(400,300)); // 大小
        PopupMenu popupMenu = new PopupMenu(); // 右键菜单

        MenuItem commentMenuItem = new MenuItem("comment");
        MenuItem cancelCommentMenuItem = new MenuItem("cancelComment");
        MenuItem copyMenuItem = new MenuItem("copy");
        MenuItem saveMenuItem = new MenuItem("save");

        // 布局组装
        popupMenu.add(commentMenuItem);
        popupMenu.add(cancelCommentMenuItem);
        popupMenu.add(saveMenuItem);
        popupMenu.add(copyMenuItem);
        panel.add(popupMenu);

        Box verticalBox = Box.createVerticalBox();
        verticalBox.add(textArea);
        verticalBox.add(panel);
        frame.add(verticalBox, BorderLayout.CENTER);

        // 事件监听设置
        ActionListener actionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                textArea.append("\n您右键菜单选择的是:" + actionCommand);
            }
        };

        commentMenuItem.addActionListener(actionListener);
        cancelCommentMenuItem.addActionListener(actionListener);
        copyMenuItem.addActionListener(actionListener);
        saveMenuItem.addActionListener(actionListener);

        // 鼠标右键监听设置
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                // super.mouseReleased(e);

                boolean popupTrigger = e.isPopupTrigger();
                if (popupTrigger) {
                    // 参数1 所属的父组件对象,
                    popupMenu.show(panel, e.getX(), e.getY());
                }
            }
        });

        frame.pack();
        frame.setVisible(true);
    }
}

效果:

 

posted @ 2021-02-05 17:50  emdzz  阅读(173)  评论(0编辑  收藏  举报