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();
    }

}

公眾號本文地址://mp.weixin.qq.com/s/wTmc9O0aDtf_NPSis37-2A

個人部落格://kohler19.gitee.io/
公眾號:愚生淺末