仓库:Java图形化界面: Java图形化界面学习demo与资料 (gitee.com)
前面讲解了如果构建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();
- }
-
- }