目录

菜单组件

案例1

案例2


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

         

    

菜单组件

      在AWT中,菜单相关组件的使用和之前学习的组件是一模一样的,只需要把菜单条、菜单、菜单项组合到一起,按照一定的布局,放入到容器中即可。

   

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

    

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

   

     

菜单相关组件使用∶

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

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

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

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

            

案例1

      

效果展示

     

代码展示

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

public class Simple {
    //创建窗口
    private Frame frame = new Frame("这里测试菜单相关组件");

    //创建菜单条
    MenuBar menuBar = new MenuBar();

    //创建菜单组件
    Menu fileMenu = new Menu("文件");
    Menu editMenu = new Menu("编辑");
    Menu formatMenu = new Menu("格式");

    //菜单项组件
    MenuItem auto = new MenuItem("自动换行");
    MenuItem copy = new MenuItem("复制");
    MenuItem paste = new MenuItem("粘贴");

    //关联快捷按Ctrl+Shift+Q
    MenuItem comment = new MenuItem("注释",new MenuShortcut(KeyEvent.VK_Q,true));
    MenuItem cancelComment = new MenuItem("取消注释");

    TextArea ta = new TextArea(6,40);


    public void init(){
        //组装视图
        comment.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ta.append("您点击了菜单项:"+e.getActionCommand()+"\n");
            }
        });

        auto.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ta.append("\n");
            }
        });

        formatMenu.add(comment);
        formatMenu.add(cancelComment);

        //组装编辑菜单
        editMenu.add(auto);
        editMenu.add(copy);
        editMenu.add(paste);
        editMenu.add(formatMenu);

        //组装菜单条
        menuBar.add(fileMenu);
        menuBar.add(editMenu);

        //把菜单条放入frame中
        frame.setMenuBar(menuBar);

        frame.add(ta);

        //设置frame最佳大小并可见
        frame.pack();
        frame.setVisible(true);


    };
    public static void main(String[] args) {
        new Simple().init();
    }
}

        

   总结/提示

  • 乱码问题
  • 如果要在某个菜单的菜单项之间添加分割线,那么只需要调用Menu的add ( new Menultem("-")) 即可。


         

案例2

任务

  • 创建PopubMenu菜单组件;

  • 创建多个Menultem菜单项,并添加到PopupMenu中;

  • PopupMenu添加到目标组件中;

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

    

效果展示

          

代码展示

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class PopupMenuText {
    private Frame frame = new Frame("这里测试PopupMenu");

    //创建文本域
    TextArea ta = new TextArea("Nick 的笔记",6,40);

    //创建Panel容器
    Panel p = new Panel();

    //创建PopupMenu
    PopupMenu popupMenu = new PopupMenu();

    //创建菜单项
    MenuItem comment = new MenuItem("注释");
    MenuItem cancelComment = new MenuItem("取消注释");
    MenuItem copy = new MenuItem("复制");
    MenuItem save = new MenuItem("保存");

    public void init(){
        //组装视图
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String actionCommand = e.getActionCommand();
                ta.append("\n"+"您点击了:"+actionCommand);
            }
        };

        comment.addActionListener(listener);
        cancelComment.addActionListener(listener);
        copy.addActionListener(listener);
        save.addActionListener(listener);

        popupMenu.add(comment);
        popupMenu.add(cancelComment);
        popupMenu.add(copy);
        popupMenu.add(save);

        p.add(popupMenu);

        //设置Panel大小
        p.setPreferredSize(new Dimension(400,300));

        //给Panel注册鼠标事件,监听用户释放鼠标的动作,展示菜单
        p.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                boolean flag = e.isPopupTrigger();
                if(flag){
                    //显示popupMenu
                    popupMenu.show(p,e.getX(),e.getY());
                }
            }
        });

        //放置ta和 p
        frame.add(ta);
        frame.add(p,BorderLayout.SOUTH);

        //设置大小,可见
        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        new PopupMenuText().init();
    }
}

         

  总结/提示

  • 乱码问题
  • MouseEvent中有个isPopupTrigger()函数,用来判断这个事件是否是弹出菜单引起的。

以后内容难度会逐渐上升,

跟不上的家人们可以回顾前面的文章,

下一期会讲

绘图相关知识~

   敬请期待哦!