菜单栏(JMenuBar)
在介绍JMenu组件前,我们先介绍JMenuBar组件,JMenuBar组件的功能是用来摆入JMenu组件.当我们建立完许多的JMenu组件后, 需要通过JMenuBar组件来将JMenu组件加入到窗口中.虽然我们由下表中看出JMenuBar组件只有一种构造方式,但是它对于构造一个菜 单来说是个不可缺少的组件.
JMenuBar构造函数:
JMenuBar():建立一个新的JMenuBar; 由于构造一个空的JMenuBar然后设置到窗口上对于窗口来说是没有意义的,因此JMenuBar需要结合至少一个以上的JMenu组件才 会在画面上显现出视觉的效果,所以JMenuBar的构造方法及范例我们留到JMenu的第一个范例中再加以说明.
菜单(JMenu)
JMenu组件是用来存放和整合JMenuItem的组件,这个组件也是在构成一个菜单中不可或缺的组件之一.JMenu可以是单一层次的结 构也可以是一个层次式的结构,要使用何种形式的结构取决于界面设计上的需要而定,如下表所示:
JMenu构造函数:
JMenu():建立一个新的JMenu.
JMenu(Action a):建立一个支持Action的新的JMenu.
JMenu(String s):以指定的字符串名称建立一个新的JMenu.
JMenu(String,Boolean b):以指定的字符串名称建立一个新的JMenu并决定这个菜单是否可以下拉式的属性.
JMenu类的常用方法如下:
public Component add (Component c): 添加指定组件到该菜单的尾部
public Component add (Component c,int dex): 添加指定组件到该菜单的指定索引位置上
public void addSeparator():添加分隔符到菜单的末尾
public JMenuItem getItem(int pos) :获取指定位置的菜单项
public int getItemCount() : 获取菜单上的项数,包括菜单项和分隔符
public void insert(String s,int pos) :添加指定文本的菜单项到指定位置
public JMenuItem insert(JMenuItem m,int pos) : 添加指定的菜单项到指定位置
public void insertSeparator(int index) : 添加分隔符到指定位置
public void remove(int pos) : 从该菜单删除指定索引处的菜单项
public void remove(JMenuItem item) :从该菜单中删除指定的菜单项
public void removeAll(): 从该菜单中删除指定的菜单项
菜单项(JMenuItem)
JMenuItem继承AbstractButton类,因此JMenuItem具有许多AbstractButton的特性,也可以说JMenuItem是一种特殊的Button,所 以JMenuItem支持许多在Button中好用的功能,例如加入图标文件或是当我们在菜单中选择某一项JMenuItem时就如同按下按钮的操作 一样触发ActionEvent,通过ActionEvent的机制我们就能针对不同的JMenuItem编写其对应的程序区段,我们来看看JMenuItem的构造 方式有哪些:
JMenuItem构造函数:
JMenuItem():建立一个新的JMenuItem.
JMenuItem(Action a):建立一个支持Action的新的JMenuItem.
JMenuItem(Icon icon):建立一个有图标的JMenuItem.
JMenuItem(String text):建立一个有文字的JMenuItem.
JMenuItem(String text,Icon icon):建立一个有图标和文字的JMenuItem.
JMenuItem(String text,int mnemonic):建立一个有文字和键盘设置快捷键的JMenuItem.
package ch10; import java.awt.event.*; import javax.swing.*; public class MenuTest extends JFrame implements ActionListener,ItemListener { private JMenu[] menu = {new JMenu("文件"), new JMenu("设置"),new JMenu("字体") }; JMenuItem open = new JMenuItem("打开"); JMenuItem save = new JMenuItem("保存"); JMenuItem saveas = new JMenuItem("另存为"); JMenuItem exit = new JMenuItem("退出"); private JMenuItem[] jmenuitem = {open,save,saveas, exit}; private JRadioButtonMenuItem [] radioButton = new JRadioButtonMenuItem[]{new JRadioButtonMenuItem("自动换行",true),new JRadioButtonMenuItem("不换行")}; private ButtonGroup buttongroup = new ButtonGroup(); private JCheckBoxMenuItem [] checkBox = new JCheckBoxMenuItem[]{new JCheckBoxMenuItem("粗体"),new JCheckBoxMenuItem("宋体"),new JCheckBoxMenuItem("斜体")}; private JMenuBar menubar = new JMenuBar(); //创建菜单栏对象 private JTextArea textarea = new JTextArea(); //创建文本区对象 private JScrollPane jscrollpane = new JScrollPane(textarea); public MenuTest () { menubar.add(menu[0]); menubar.add(menu[1]); for(int i=0;i<jmenuitem.length;i++) { menu[0].add(jmenuitem[i]); jmenuitem[i].addActionListener(this); } for(int i=0;i<radioButton.length;i++) { menu[1].add(radioButton[i]); radioButton[i].addItemListener(this); buttongroup.add(radioButton[i]); } menu[1].addSeparator(); //添加分割线到“设置”菜单 menu[1].add(menu[2]); for(int i=0;i<checkBox.length;i++) { menu[2].add(checkBox[i]); checkBox[i].addItemListener(this); } this.setJMenuBar(menubar); this.setBounds(200,200,300,200); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE ); this.setTitle("菜单小测试"); this.add(jscrollpane); } String newline = "\n"; public void actionPerformed(ActionEvent a) { JMenuItem source = (JMenuItem)(a.getSource()); String s = "监测事件。"+newline+"事件源:"+source.getText()+"(选择对象"+getClassName(source)+")"; textarea.append(s+newline); } public void itemStateChanged(ItemEvent a) { JMenuItem source = (JMenuItem)(a.getSource()); String s = "菜单监听"+newline+"事件源:"+source.getText()+"(选择对象"+getClassName(source)+")"+newline+"新的状态:"+((a.getStateChange()==ItemEvent.SELECTED)?"选择":"不选择"); textarea.append(s+newline); } protected String getClassName(Object o) { String classString = o.getClass().getName(); int dotIndex = classString.lastIndexOf("."); return classString.substring(dotIndex+1); } public static void main(String args[]) { new MenuTest(); } }