JMenuBar菜单栏

来自CloudWiki
跳转至: 导航搜索

真正的GUI应用程序缺少不了菜单(如下图所示),它可以给用户提供简明清晰的信息,让用户从多个项目中进行选择,又可以节省界面空间。位于窗口顶部的菜单栏和其子菜单一般会包括一个应用程序的所有方法和功能,是比较重要的组件。

Java9-1.png

在程序中使用普通菜单的基本过程如下:

  1. 创建一个菜单栏(JMenuBar);
  2. 创建若干菜单项(JMenu),并把它们添加到(JMenuBar)中;
  3. 创建若干个菜单子项(JMenuItem),或者创建若干个带有复选框的菜单子项(JCheckboxMenuItem),并把它们分类别地添加到每个JMenu中;
  4. 通过JFrame类的setJMenuBar()方法,将菜单栏JMenuBar添加到框架上,使之能够显示。

JMenuBar菜单栏

JMenuBar是放置菜单的菜单条,可过new JmenuBar()构造一个菜单条对象。JMenuBar构造方法及常用方法如下:

方法名	方法功能
JMenuBar ()	构造新菜单栏JMenuBar
JMenu getMenu(int index)	返回菜单栏中指定位置的菜单
int getMenuCount()	返回菜单栏上的菜单数
void paintBorder(Graphics g)	如果 BorderPainted 属性为 true,则绘制菜单栏的边框
void setBorderPainted(boolean b)	设置是否应该绘制边框
void setHelpMenu(JMenu menu)	设置用户选择菜单栏中的“帮助”选项时显示的帮助菜单
void setMargin(Insets m)	设置菜单栏的边框与其菜单之间的空白
void setSelected(Component sel)	设置当前选择的组件,更改选择模型

以下代码给出了如何创建myJMenuBar,并添加到JDialog中:

JMenuBar myJMenuBar=new JMenuBar();
JDialog myJDialog=new JDialog();
myDialog.setJMenuBar(myJMenuBar);

JMenu菜单项

JMenu是菜单项对象, 用new JMenu(“文件”)构造一个菜单条目对象。例如:JMenu menu = new JMenu("文件(F)");// 创建一个菜单对象

JMenu的构造方法及常用方法如下:

方法名	方法功能
JMenu()	构造没有文本的新 JMenu
JMenu(Action a)	构造一个从提供的 Action 获取其属性的菜单
JMenu(String s)	构造一个新 JMenu,用提供的字符串作为其文本
JMenu(String s, boolean b)	构造一个新 JMenu,用提供的字符串作为其文本并指定其是否为分离式 (tear-off) 菜单
void add()	将组件或菜单项追加到此菜单的末尾
void addMenuListener(MenuListener l)	添加菜单事件的侦听器
void addSeparator()	将新分隔符追加到菜单的末尾
void doClick(int pressTime)	以编程方式执行“单击”
JMenuItem getItem(int pos)	返回指定位置的 JMenuItem
void setMenuLocation(int x, int y)	设置弹出组件的位置
int getItemCount()	返回菜单上的项数,包括分隔符
JMenuItem insert(Action a, int pos)	在给定位置插入连接到指定 Action 对象的新菜单项
JMenuItem insert(JMenuItem mi, int pos)	在给定位置插入指定的 JMenuitem
void insert(String s, int pos)	在给定的位置插入一个具有指定文本的新菜单项
void insertSeparator(int index)	在指定的位置插入分隔符
boolean isSelected()	如果菜单是当前选择的(即突出显示的)菜单,则返回 true
void remove()	从此菜单移除组件或菜单项
void removeAll()	从此菜单移除所有菜单项
void setDelay(int d)	设置菜单的 PopupMenu 向上或向下弹出前建议的延迟
void setMenuLocation(int x, int y)	设置弹出组件的位置

JMenuItem菜单子项

JMenuItem是菜单项子项类, 通过new JmenuItem(“菜单条目1”)方法构造一个菜单项子项对象。其构造方法及常用方法如下:

方法名	方法功能
JMenuItem()	创建不带有设置文本或图标的 JMenuItem
JMenuItem(Action a)	创建一个从指定的 Action 获取其属性的菜单项
JMenuItem(Icon icon)	创建带有指定图标的 JMenuItem
JMenuItem(String text)	创建带有指定文本的 JMenuItem
JMenuItem(String text, Icon icon)	创建带有指定文本和图标的 JMenuItem
JMenuItem(String text, int mnemonic)	创建带有指定文本和键盘助记符的 JMenuItem
boolean isArmed()	返回菜单项是否被“调出”
void setArmed(boolean b)	将菜单项标识为“调出”
void setEnabled(boolean b)	启用或禁用菜单项
void setAccelerator( KeyStroke keystroke)	设置菜单项的快捷键
void setMnemonic(char mnemonic)	设置菜单项的热键
KeyStroke getAccelerator( )	返回菜单项的快捷键

示例代码如下:

JMenuItem item = new JMenuItem("新建(N)", KeyEvent.VK_N); 
// 创建带有指定文本//和键盘助记符的 JMenuItem。
item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,    ActionEvent.CTRL_MASK));
// 设置修改键,它能直接调用菜//单项的操作侦听器而不必显示菜单的层次结构。
menu.add(item);// 将JMenuItem项添加到菜单栏中去

JCheckBoxMenuItem

JCheckboxMenuItem类用于创建复选菜单项。当选中复选框菜单子项时,在该菜单子项左边出现一个选择标记,如果再次选中该项,则该选项左边的选择标记就会消失。

JCheckBoxMenuItem构造方法及常用方法:

方法名	方法功能
JCheckBoxMenuItem()  	创建一个不带有设置文本或图标的复选菜单项
JCheckBoxMenuItem(String text)	创建一个有指定文本的复选菜单项
JCheckBoxMenuItem(Icon icon)	创建一个带有指定图标的复选菜单项
JChcckBoxMenuItem(String text, Icon icon)	创建一个有文本和图标的复选菜单项
JCheckBoxMenulte(String text, Boolean b)	创建一个有文本和设置选择状态复选菜单项
JChcckBoxMenuItem(String text, Icon icon, Boolean b)	创建一个有文本、图标和设置选择状态的复选菜单项
Boolean getState()  	返回菜单项的选定状态
void setState(Boolean b)	设置该项的选定状态

例如:

JCheckBoxMenuItem cbMenuItem = new JCheckBoxMenuItem("自动换行");

JRadioButtonMenuItem

JRadioButtonMenuItem类用于创建带有单选菜单项,属于一组菜单项中的一项,该组中只能选择一个项,被选择的项显示其选择状态,选择此项的同时,其他任何以前被选择的项都切换到未选择的状态。

JRadioButtonMenuItem构造方法及常用方法:

方法名	方法功能
JRadioButtonMenuItem()  	创建一个新的单选菜单项
JRadioButtonMenuItem(String text)	创建一个有指定文本的单选菜单项
JRadioButtonMenuItem(Icon icon)	创建一个带有指定图标的单选菜单项
JRadioButtonMenuItem
(String text, Icon icon)	创建一个有文本和图标的单选菜单项
JRadioButtonMenulte
(String text, Boolean selected)	创建一个有文本和设置选择状态的单选菜单项
JRadioButtonMenuItem
(Icon icon, Boolean selected)	创建一个有图标和设置选择状态的单选菜单项
JRadioButtonMenuItem
(String text, Icon icon, Boolean selected)	创建一个有文本、图标和设置选择状态的单选菜单项

例如:

JRadioButtonMenuItem mrButton = new JRadioButtonMenuItem("男",gender);
JRadioButtonMenuItem missButton = new JRadioButtonMenuItem("女",!gender);


案例精选

练习:程序TestMenu.java设计了一个带有菜单的图形用户界面程序,使用级联菜单控制文字的字体和颜色。

原始代码

package main;

import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class MenuTest  extends JFrame {
	
	JTextArea txtDemo = new JTextArea(10,30);
	
	public MenuTest(){			
	
		
		//添加文本区字体格式
		txtDemo.setFont(new Font("Serif", Font.PLAIN,24));
		getContentPane().add(txtDemo);
		pack();
		setTitle("菜单控制字体和颜色");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MenuTest test=new MenuTest();
	}

}


创建菜单栏

添加成员变量:菜单栏

JMenuBar jmb = new JMenuBar();


在构造方法里将菜单栏添加到框架中:

this.setJMenuBar(jmb);



为菜单栏添加菜单项

代码:

package main;

import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.*;

public class MenuTest  extends JFrame {
	JMenuBar jmb = new JMenuBar();
	JMenu fontMenu = new JMenu("字体(F)");
	JMenu helpMenu = new JMenu("帮助");
	JMenu styleMenu = new JMenu("样式");
	JMenu colorMenu = new JMenu("颜色");
	JTextArea txtDemo = new JTextArea(10,30);
	
	public MenuTest(){		
		this.setJMenuBar(jmb);
		
		jmb.add(fontMenu);
		jmb.add(helpMenu);
		fontMenu.setMnemonic(KeyEvent.VK_F);		
		fontMenu.add(styleMenu);
		fontMenu.add(colorMenu);
		
		
		//添加文本区字体格式
		txtDemo.setFont(new Font("Serif", Font.PLAIN,24));
		getContentPane().add(txtDemo);
		pack();
		setTitle("菜单控制字体和颜色");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setResizable(false);
		this.setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MenuTest test=new MenuTest();
	}

}

为菜单项添加菜单子项

JMenuItem

在开始的例子上继续添加成员变量:

JMenuItem exitMenu = new JMenuItem("退出");
JMenuItem aboutMenu = new JMenuItem("关于");

相应的,在构造函数里添加:

fontMenu.addSeparator();
fontMenu.add(exitMenu);
fontMenu.add(aboutMenu);

思考:菜单项和菜单子项有什么区别 ?

JCheckBoxMenuItem

在开始的例子中继续添加成员变量:

JCheckBoxMenuItem boldMenu = new JCheckBoxMenuItem("粗体");
JCheckBoxMenuItem italicMenu = new JCheckBoxMenuItem("斜体");
	

相应的在构造方法里面写:

//添加字体样式子菜单
		styleMenu.add(boldMenu);
		styleMenu.add(italicMenu);
		

JRadioButtonMenuItem

在开始的例子中继续添加成员变量:

JRadioButtonMenuItem redMenu = new JRadioButtonMenuItem("红色");
JRadioButtonMenuItem greenMenu = new JRadioButtonMenuItem("绿色");
JRadioButtonMenuItem blueMenu = new JRadioButtonMenuItem("蓝色");

相应的在构造方法里面写:

//添加字体样式子菜单
		//添加颜色子菜单
		ButtonGroup group=new ButtonGroup();
                //ButtonGroup用于为一组按钮创建一个多斥(multiple-exclusion)作用域。使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。 		
		group.add(redMenu);
		group.add(greenMenu);
		group.add(blueMenu);
		colorMenu.add(redMenu);
		colorMenu.add(greenMenu);
		colorMenu.add(blueMenu);

菜单事件处理

类的声明改为:

public class MenuTest  extends JFrame implements ActionListener

添加事件监听器:

// 菜单选择事件处理
		@Override
		public void actionPerformed(ActionEvent e) {
			//获得文本区字体格式
			int bold=txtDemo.getFont().isBold()?1:0;
			int italic=txtDemo.getFont().isItalic()?1:0;
			int size=txtDemo.getFont().getSize();
			String cmd = e.getActionCommand();
			if (cmd.equals("红色"))
				txtDemo.setForeground(Color.RED);
			else if (cmd.equals("绿色"))
				txtDemo.setForeground(Color.GREEN);
			else if (cmd.equals("蓝色"))
				txtDemo.setForeground(Color.BLUE);
			else if (cmd.equals("粗体"))
				bold = boldMenu.isSelected() ? Font.BOLD : Font.PLAIN;
			else if (cmd.equals("斜体"))
				italic = italicMenu.isSelected() ? Font.ITALIC : Font.PLAIN;
			else if (cmd.equals("退出"))
				System.exit(0);
			txtDemo.setFont(new Font("Serif", bold + italic,size));
		}

程序运行结果如下图所示:

知识点提炼

  1. JComboBox组件是将按钮或可编辑字段与下拉列表组合的组件。
  2. ComboBox的事件处理可分为两种:一种是用户选取项目时生成事件ItemEven,可以使用ItemListener来处理事件,另一种是用户在JComboBox上自行输入完毕后按下[Enter]键, 会产生ActionEvent事件,可以使用ActionListener处理器处理该事件。
  3. JTable组件用于显示二维表格对象。可以根据现有的数组和向量来创建JTable对象,也可以根据TableModel对象创建JTable对象
  4. JTable对象使用TableModel对象管理表格中的数据,如果程序中没有创建TabelModel对象,JTable会自动创建一个默认的TableModel对象。

返回 Java程序设计