高级Swing组之菜单应用

                                                                    第一节:高级Swing组之菜单应用

目标:

1. 掌握菜单基本用法;

2. 初步理解菜单组件中应用的Command设计模式;

1.菜单的基本概念: 2

2.窗体上的菜单使用示例: 2

3.菜单事件处理和内置窗体实现: 4

4.Jtree上的弹出菜单示例: 6

总结和任务: 8

编写 黄荣

 

 

1.菜单的基本概念:

Menu(菜单)是窗体程序最常用的一种组件,在Swing体系中,有二种菜单:

一种是基于菜单条的,一般加在JFrame组件上;

一种是JpopupMenu:可以其它swing组件是单击右键的弹出式菜单。

本节我们示例讲创建窗体对象上的菜单条,菜单条上的菜单由三部分组成:

javax.swing.JmenuBar类:放置菜单的菜单条,可过new JmenuBar()构造一个菜单条对象

javax.swing.JMenu : 菜单目录对象, new JMenu(“文件”),构造一个菜单条目对象

javax.swing.JmenuItem: 菜单条条目类, new JmenuItem(“菜单条目1”),构造一个菜单条目对象

    以上三者的关系是:JMenu必须放在一个JmenuBar上,JMenu的子项可以是一个Jmenu或JmenuItem,JmenuItem做为一个子菜单项,必须放在一个JMenu上做为其子项,


   以上说明,无非是让你先有个结构性的理解:这东东很简单,就像小时玩的搭积木游戏一样:

 

 

2.窗体上的菜单使用示例:

 没啥说的了,看代码:

public class MenuTest {

//程序入口

public static void main(String[] args) {

MenuTest tf=new MenuTest();

tf.showUI();

}

//显示一个加有多个组件的窗体界面

public void showUI(){

    javax.swing.JFrame frame=new javax.swing.JFrame();

    frame.setTitle("菜单添加示例");

    //在放置元素组件前,要创建并给窗体加上流式布局管理器对象:

    java.awt.FlowLayout fl=new java.awt.FlowLayout();

    frame.setLayout(fl);

    frame.setSize(200,100);//设置窗体大小

    //窗体关闭时程序退出

    frame.setDefaultCloseOperation(3);

    frame.setJMenuBar(createMB());

    //让窗体显示出来,这句要放到最后面 

    frame.setVisible(true);

     }

//这个方法调用后,创建一个带有菜单的菜单条,就加到到JFrame上显示

private javax.swing.JMenuBar createMB(){

//创建菜单条:

  javax.swing.JMenuBar mb=new javax.swing.JMenuBar();

     //1.创建文件菜单:

   javax.swing.JMenu m_file=new javax.swing.JMenu("文件");

      //1.1创建文件菜单下的菜单项:

   javax.swing.JMenuItem mi_open=new javax.swing.JMenuItem("打开");

   javax.swing.JMenuItem mi_new=new javax.swing.JMenuItem("新建");

   javax.swing.JMenuItem mi_exit=new javax.swing.JMenuItem("退出");

       //1.2将菜单项加到文件菜单上:

   m_file.add(mi_open);

   m_file.add(mi_new);

   m_file.add(mi_exit);

   //2.创建功能菜单

   javax.swing.JMenu m_oper=new javax.swing.JMenu("数据管理");

        //2.1创建功能菜单下的菜单项:

   javax.swing.JMenuItem mi_add=new javax.swing.JMenuItem("新增");

   javax.swing.JMenuItem mi_modi=new javax.swing.JMenuItem("新建修改");

   javax.swing.JMenuItem mi_delete=new javax.swing.JMenuItem("删除");

   javax.swing.JRadioButton mi_radi=new javax.swing.JRadioButton("总在最前");

   javax.swing.JMenuItem mi_about=new javax.swing.JMenuItem("关于");

   //2.2将上述菜单项加到功能菜单上:

   m_oper.add(mi_add);

   m_oper.add(mi_modi);

   m_oper.add(mi_delete);

   m_oper.add(mi_about);

    m_oper.addSeparator();//加上一个分割条

   m_oper.add(mi_radi);

   //3.将文件和功能菜单加到菜单条上:

   mb.add(m_file);

   mb.add(m_oper);

   return mb;

}  

}

光有菜单肯定是不行滴,菜单可以调用其addActionListener方法加入事件监听器,当菜单被点击时,其事件监听器对象中实现的方法就会被调用。

3.菜单事件处理和内置窗体实现:

在菜单事件处理中,我们改进了事件监听的方法:不是为每个菜单都创建一个事件监听器,让它他都使用统一的一个监听器,在监听器调用的方法中,根据事件源(即菜单)上设定的命令关键定,判断点击的是哪个菜单,再决做调用什么方法动作。

   在本节中,我们还实现了一个新功能,就是在JFrame对象内显示多个子窗体,或叫内置窗体;内置窗体是javax.swing.JinternalFrame类的对象,它用JFrame有基本相同的调用方法,区别只是---它只能用来显示在JFrame内部。

 

 实现的代码如下:

import java.awt.event.ActionEvent;

//1.菜单事件处理例程:

//2.内置窗体实现

public class MenuTest {

//创建一个JDesktopPane就可以在窗体内放置内置窗体对象";

private javax.swing.JDesktopPane jdp=new javax.swing.JDesktopPane();

//程序入口

public static void main(String[] args) {

MenuTest tf=new MenuTest();

tf.showUI();

}

 //处理菜单事件的方法

private void processMenuEvent(ActionEvent e){

//得到事件源上的命令关键字:

String command=e.getActionCommand();

if(command.equals("open")){//点击了打开菜单

//创建内部窗体对象并设定其属性

javax.swing.JInternalFrame jin=new javax.swing.JInternalFrame();

jin.setTitle("我是内部窗体");

jin.setSize(200, 100);

jin.setVisible(true);

jin.setMaximizable(true);

//加到界面上

jdp.add(jin);

}else if(command.equals("new")){ 

//弹出一个对话框:

javax.swing.JOptionPane.showInputDialog("要创建什么?");

}else if(command.equals("exit")){ 

//程序退出

System.exit(0);

}

}

//显示一个加有多个组件的窗体界面

public void showUI(){

    javax.swing.JFrame frame=new javax.swing.JFrame();

    frame.setTitle("菜单事件处理和内部窗体示例");

    //在放置元素组件前,要创建并给窗体加上流式布局管理器对象:

    java.awt.FlowLayout fl=new java.awt.FlowLayout();

    frame.setLayout(fl);

    frame.setSize(300,200);//设置窗体大小

    //窗体关闭时程序退出

    frame.setDefaultCloseOperation(3);

    frame.setJMenuBar(createMB());

    //JDesktopPane对象中到窗体中,

    frame.setContentPane(jdp);

    //让窗体显示出来,这句要放到最后面 

    frame.setVisible(true);

     }

//创建菜单条对象

private javax.swing.JMenuBar createMB(){

//创建菜单条:

  javax.swing.JMenuBar mb=new javax.swing.JMenuBar();

     //1.创建文件菜单:

   javax.swing.JMenu m_file=new javax.swing.JMenu("文件");

      //1.1创建文件菜单下的菜单项:

   javax.swing.JMenuItem mi_open=new javax.swing.JMenuItem("打开");

   mi_open.setActionCommand("open");//设置菜单的命令关键字

   javax.swing.JMenuItem mi_new=new javax.swing.JMenuItem("新建");

   mi_new.setActionCommand("new");

   javax.swing.JMenuItem mi_exit=new javax.swing.JMenuItem("退出");

   mi_exit.setActionCommand("exit");

   //创建内部料的菜单事件监听器对象:

   java.awt.event.ActionListener ac_listener=new java.awt.event.ActionListener(){

   public void actionPerformed(ActionEvent e){

   //调用统一的处理方法

   processMenuEvent(e);

   }

   };  

   //1.2 给菜单项加上事件监听器:

   mi_open.addActionListener(ac_listener);

   mi_new.addActionListener(ac_listener);

   mi_exit.addActionListener(ac_listener);

   //1.2将菜单项加到文件菜单上:

   m_file.add(mi_open);

   m_file.add(mi_new);

   m_file.add(mi_exit);

   //3.将文件和功能菜单加到菜单条上:

   mb.add(m_file);

   return mb;

}

}

以上代码中,最简单的就是弹出一个对话框了,在javax.swing.JoptionPane类中,提供了非常多的弹出各种你所能想像到的对话框的静态调用方法,多测试几种试试看?

 

4.Jtree上的弹出菜单示例:

弹出式菜单我先就说一句话,就是把javax.swing.JmenuBar对象换成javax.swing.JpopupMenu对象,然后调用要加上弹出菜单功能的swing组件的setComponentPopupMenu方法传入JpopupMenu对象即可。

 

实现的代码如下示:

import java.awt.event.ActionEvent;

//添加JTree组件和弹出菜单示例:

public class PopMenuTest{

     //程序入口

public static void main(String[] args) {

PopMenuTest pt=new PopMenuTest();

pt.showUI();

}

public void showUI(){

javax.swing.JFrame frame=new javax.swing.JFrame();

frame.setTitle("添加JTree组件和弹出菜单示");

java.awt.FlowLayout fl=new java.awt.FlowLayout();

    frame.setLayout(fl);

    frame.setSize(300,200);

    //创建一个默认的JTree组件对象

    javax.swing.JTree tree=new javax.swing.JTree();

    //将弹出菜单对象设到树上:

    javax.swing.JPopupMenu pop=createPopMenu();

    tree.setComponentPopupMenu(pop);

    //将默认树加到界面上

    frame.add(tree);    

    //窗体关闭时程序退出

    frame.setDefaultCloseOperation(3); 

    frame.setVisible(true);

}

//创建弹出菜单

private javax.swing.JPopupMenu createPopMenu(){

//创建弹出菜单对象

  javax.swing.JPopupMenu popMenu=new javax.swing.JPopupMenu();

    //1创建文件菜单下的菜单项:

   javax.swing.JMenuItem mi_open=new javax.swing.JMenuItem("添加");

   mi_open.setActionCommand("add");//设置菜单的命令关键字

   javax.swing.JMenuItem mi_new=new javax.swing.JMenuItem("删除");

   mi_new.setActionCommand("del");

   javax.swing.JMenuItem mi_exit=new javax.swing.JMenuItem("修改");

   mi_exit.setActionCommand("mod");

   //创建内部料的菜单事件监听器对象:

   java.awt.event.ActionListener ac_listener=new java.awt.event.ActionListener(){

   public void actionPerformed(ActionEvent e){

   //调用统一的处理方法,此处简单弹出一个对话框:

javax.swing.JOptionPane.showMessageDialog(null,"你想执行的功能是: "+e.getActionCommand());

   

   }

   };  

   //2 给菜单项加上事件监听器:

   mi_open.addActionListener(ac_listener);

   mi_new.addActionListener(ac_listener);

   mi_exit.addActionListener(ac_listener);

   //3 将菜单项加到弹出菜单对象上:

   popMenu.add(mi_open);

   popMenu.add(mi_new);

   popMenu.add(mi_exit);

   return popMenu;

}

}

  弹出菜单的事件机制跟上例中是相同的,接下来你看定想到,我们如何真正实现本例的对树上节点的操作?自己摸索下看先?

总结和任务:

1.实践:完成本节示例代码的编写;

2.总结:菜单组件所使用的command设计模式的理解:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值