一篇文章带你认识 AWT 菜单组件
目录
案例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()函数,用来判断这个事件是否是弹出菜单引起的。
以后内容难度会逐渐上升,
跟不上的家人们可以回顾前面的文章,
下一期会讲
绘图相关知识~
敬请期待哦!