Java Swing组件:菜单

本文详细介绍了JavaGUI编程中的下拉式菜单(JMenu、JMenuItem)和弹出式菜单(JPopupMenu)的使用,包括菜单栏、菜单项的创建、快捷键设置以及ActionListener和ItemListener的事件处理。
摘要由CSDN通过智能技术生成

目录

1. 下拉式菜单

2. 弹出式菜单


       菜单是图形用户界面程序中最常用的一种组件。根据显示方式,菜单可分为下拉式菜单和弹出式菜单。菜单组件主要包括:菜单栏(JMenuBar)、下拉式菜单(JMenu)、菜单项(JMenuItem)和弹出式菜单(JPopupMenu)等。

1. 下拉式菜单

       下拉式菜单是放置在菜单栏上的组件。菜单栏(JMenuBar)是窗口中的主菜单,可以包含一组下拉式菜单。菜单栏通过JMenuBar类来实现,其只有一个默认的构造方法。在JFrame等类顶层容器类中定义了setJMenuBar(JMenuBar menu)方法,可以将菜单栏放到窗口的上方,通过JMenuBar类的add(JMenu c)方法可以把菜单加入到菜单栏上。下拉式菜单是通过JMenu类来实现,下拉式菜单可以包含菜单或菜单项。JMenu类提供了setMnemonic(char mnemonic)方法来设置菜单的快捷键。可以使用JMenu类中定义的addSeparator()和insertSeparator(int index)方法在菜单项之间插入分隔符。

       例如,下面代码创建菜单栏和下拉式菜单,并将菜单栏放到窗口上以及将下拉式菜单放到菜单栏上。

JFrame frame=new JFrame("菜单示例");

JMenuBar menuBar=new JMenuBar();//创建菜单栏

frame.setJMenuBar(menuBar);//将菜单栏放到窗口上

JMenu fileMenu=new JMenu("File");//创建File菜单

fileMenu.setMnemonic(KeyEvent.VK_F);//设置快捷键(Alt+F)

menuBar.add(fileMenu);//File菜单放到菜单栏上

JMenu editMenu=new JMenu("Edit");//创建Edit菜单

editMenu.setMnemonic(KeyEvent.VK_E);//设置快捷键(Alt+E)

menuBar.add(editMenu);//Edit菜单放到菜单栏上

JMenu newMenu=new JMenu("New");//创建New菜单

fileMenu.add(newMenu);//New菜单放到File菜单上

       如果将整个菜单系统看作是一棵树,那么菜单项就是这棵树的叶子,是菜单系统的最下一级。基本菜单项是由JMenuItem类来实现,其主要构造方法如下:

  • JMenuItem(String text):创建一个显示文本的菜单栏。
  • JMenuItem(Icon icon):创建一个显示图标的菜单栏。
  • JMenuItem(String text, Icon icon):创建一个同时显示文本和图标的菜单栏。
  • JMenuItem(String text, int mnemonic):创建一个显示文本和快捷键的菜单项。

       其中,文本由参数text指定,图标由参数icon指定,快捷键由参数mnemonic指定。例如:

//创建菜单项

JMenuItem menuItem1=new JMenuItem("Java Project",KeyEvent.VK_J);

JMenuItem menuItem2=new JMenuItem("Web Project",KeyEvent.VK_W);

//将菜单项放到菜单上

newMenu.add(menuItem1);

newMenu.add(menuItem2);

       可以使用JMenuItem类的setAccelerator(KeyStroke keystroke)方法设置菜单项的快捷键。KeyStroke是一个表示键盘操作的类,可以使用该类的静态方法getKeyStroke()设置相应的快捷键,其定义如下:

  • public static KeyStroke getKeyStroke(char keyChar);
  • public static KeyStroke getKeyStroke(int keyCodem, int modifiers);

    例如:

//设置快捷键(J

menuItem1.setAccelerator(KeyStroke.getKeyStroke("J"));

//设置快捷键(Ctr+W

menuItem2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,ActionEvent.CTRL_MASK));

       当菜单中的菜单项被选中时,将会触发一个ActionEvent事件,因此,需要为菜单项注册ActionListener事件监听器,以便对ActionEvent事件做出响应。

       复选菜单项(JCheckBoxMenuItem)和单选菜单项(JRadioButtonMenuItem)是两种特殊的菜单项,它们与普通菜单项类似,可以显示文本和图标,但由于复选菜单项和单选菜单项具有选中和不选中状态,因此,在构造方法中可以用boolean型参数指定菜单的初始状态。当复选菜单项和单选菜单项的状态发生变化时,将会触发ItemEvent事件,因此,需要为复选菜单项和单选菜单项注册ItemListener事件监听器,以便捕获其状态的变化。

【例1】下拉式菜单的使用。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JMenuDemo extends JFrame implements ActionListener,ItemListener{
	JMenuBar menuBar;   //菜单栏
	JMenu menu,subMenu; //菜单、子菜单
	JMenuItem menuItem; //菜单项
	JCheckBoxMenuItem checkBoxMenuItem;//复选菜单项
	JRadioButtonMenuItem radioButtonMenuItem;//单项菜单项
	JTextField textField;//文本框
	public JMenuDemo() {
		setTitle("下拉式菜单示例");
		setSize(400,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		menuBar=new JMenuBar();//创建菜单栏
		setJMenuBar(menuBar);//将菜单栏加入到窗口上
		//创建文File菜单
		menu=new JMenu("File");
		menu.setMnemonic(KeyEvent.VK_F);//设置快捷键(ALt+F)
		menuBar.add(menu);
		
		//创建File菜单的New子菜单
		subMenu=new JMenu("New");
		menu.add(subMenu);
		
		//创建Java Project菜单项
		menuItem=new JMenuItem("Java Project",KeyEvent.VK_J);
	 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_J,
                             ActionEvent.CTRL_MASK)); //快捷键(Ctrl+J)
		menuItem.addActionListener(this);//注册ActionListener事件监听器
		subMenu.add(menuItem);//添加到New菜单上
		
		//创建Web Project菜单项
		menuItem=new JMenuItem("Web Project");
        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
                                ActionEvent.CTRL_MASK)); //快捷键(Ctrl+D)
		menuItem.addActionListener(this);//注册ActionListener事件监听器
		subMenu.add(menuItem);//添加到New菜单上
		
		//创建Open菜单项
		menuItem=new JMenuItem("Open");
		menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
                                ActionEvent.CTRL_MASK)); //快捷键(Ctrl+O)
		menuItem.addActionListener(this);//注册ActionListener事件监听器
		menu.add(menuItem);//添加到File菜单上
		
		//创建File菜单的Exit菜单项
		menuItem=new JMenuItem("Exit");
         menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
                                 ActionEvent.CTRL_MASK)); //快捷键(Ctrl+E)
		menuItem.addActionListener(this);//注册ActionListener事件监听器
		menu.add(menuItem);
		
		//创建文Edit菜单
		menu=new JMenu("Edit");
		menu.setMnemonic(KeyEvent.VK_E);
		menuBar.add(menu);
		
		//创建Undo菜单项
		menuItem=new JMenuItem("Undo");
		menu.add(menuItem);//添加到Edit菜单上
		
		//创建Redo菜单项
		menuItem=new JMenuItem("Redo");
		menu.add(menuItem);//添加到Edit菜单上
		menu.addSeparator();//加入分割线
		
		//创建复选菜单项
		checkBoxMenuItem=new JCheckBoxMenuItem("Smart Insert Mode");
		checkBoxMenuItem.addItemListener(this);//注册ItemListener事件监听器
		menu.add(checkBoxMenuItem);//添加到Edit菜单上
		menu.addSeparator();//加入分割线
		
		//创建单项菜单项
		ButtonGroup group=new ButtonGroup();//创建按钮组
		radioButtonMenuItem=new JRadioButtonMenuItem("Samll");
		radioButtonMenuItem.addItemListener(this);//注册ItemListener事件监听器
		menu.add(radioButtonMenuItem);//添加到Edit菜单上
		group.add(radioButtonMenuItem);//添加到按钮组中
		
		radioButtonMenuItem=new JRadioButtonMenuItem("Large");
		radioButtonMenuItem.addItemListener(this);//注册ItemListener事件监听器
		menu.add(radioButtonMenuItem);//添加到Edit菜单上
		group.add(radioButtonMenuItem);//添加到按钮组中
		
		textField=new JTextField();
		add(textField,BorderLayout.SOUTH);
		setVisible(true);
	}
	//实现ActionListener接口中的方法
	public void actionPerformed(ActionEvent e) {
		String command=e.getActionCommand();
		textField.setText(command);
	}
	//实现ItemListener接口中的方法
	public void itemStateChanged(ItemEvent e) {
		JMenuItem menuItem=(JMenuItem)e.getSource();
		String command=menuItem.getText();
		int state=e.getStateChange();
		if(state==ItemEvent.SELECTED) {
			command+=" SELECTED";
		}else if(state==ItemEvent.DESELECTED) {
			command+=" DESELECTED";
		}
		textField.setText(command);
	}
		public static void main(String[] args) {
		JMenuDemo frame=new JMenuDemo();
	}
}

       运行上述程序,生成的菜单结构如图1所示。由于快捷键的设置,按Ctr+J键,触发ActionEvent事件,引发actionPerformed(ActionEvent e)方法的执行,在窗口下方的文本框中显示Java Project,类似地,按Ctrl+W、Ctrl+O和Ctrl+E键,将会显示相应菜单项的文本信息。点击Edit菜单下的复选菜单项和单选菜单项,将触发ItemEvent事件,从而引发itemStateChanged(ItemEvent e)方法的执行,在窗口下方的文本框中显示菜单项文本+状态信息

(a) (b)

图1. 下拉式菜单使用示例

2. 弹出式菜单

       弹出式菜单(JPopupMenu)是一种相对独立的菜单,可根据需要显示在指定的位置,在弹出式菜单中可以添加菜单或菜单项。JPopupMenu类的构造方法如下:

  • JPopupMenu():创建一个没有名称的弹出式菜单。
  • JPopupMenu(String label):创建一个有指定名称的弹出式菜单。

       一般来说,单击鼠标的右键可以触发一个弹出式菜单,如果希望在某一组件中弹出菜单,可以使用该组件的setComponentPopupMenu(JpopupMenu popup)方法,其中,popup是希望触发的弹出式菜单。

【例2】弹出式菜单的使用。

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
public class JPopupMenuDemo extends JFrame implements ActionListener{
	JPopupMenu popupMenu=new JPopupMenu("PopupMenu");//创建弹出式菜单
	JTextField textField=new JTextField();
	JPanel panel=new JPanel();
	JMenuItem menuItem;
	public JPopupMenuDemo() {
		setTitle("弹出式菜单示例");
		setSize(400,300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		//菜单项:Copy
		menuItem=new JMenuItem("Copy");
		menuItem.addActionListener(this);
		popupMenu.add(menuItem);
		
		//菜单项:Cut
		menuItem=new JMenuItem("Cut");
		menuItem.addActionListener(this);
		popupMenu.add(menuItem);
		
		//菜单项:Paste
		menuItem=new JMenuItem("Paste");
		menuItem.addActionListener(this);
		popupMenu.add(menuItem);
		
		panel.setComponentPopupMenu(popupMenu);//点击面板右键触发弹出式菜单
		add(panel,BorderLayout.CENTER);
		add(textField,BorderLayout.SOUTH);
		setVisible(true);
	}
	//实现ActionListener接口中的方法
	public void actionPerformed(ActionEvent e) {
		String command=e.getActionCommand();
		textField.setText(command);
	}
	public static void main(String[] args) {
		JPopupMenuDemo frame=new JPopupMenuDemo();
	}
}

       运行上述程序,执行结果如图2所示。在窗口中间区域点击鼠标右键触发弹出式菜单,如图2(a)所示,点击相应的菜单项则会在窗口下方的文本框中显示菜单项的文本,如图2(b)所示。

(a)

(b)

图2. 弹出式菜单使用示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值