Swing菜单与工具栏(一)
本书的前面两章描述了一些低级的Swing组件。本章将会深入Swing面向菜单的组件。菜单与工具栏通过提供一些可视化的命令选项可以使得我们的程序更为友好。尽管Swing组件可以支持多个按键的命令序列,菜单被设计用来提供使用鼠标的图形化选择,而不是通过键盘。
本章将要讨论的菜单组件的使用如下:
- 对于级联菜单,我们可以创建一个JMenu组件,并将其添加到JMenuBar。
- 对于JMenu中的可选菜单,我们可以创建一个JMenuItem组件,并将其添加到JMenu。
- 要创建子菜单,我们可以向JMenu添加一个新的JMenu,并向新菜单添加JMenuItem选项。
- 然后,当一个JMenu被选中时,系统会在JPopupMenu中显示其当前的组件集合。
除了基本的JMenuItem元素,本章将还会讨论其他的菜单项目,例如JCheckBoxMenuItem以及JRadioButtonMenuItem,我们可以将这两个菜单项目放在JMenu中。同时我们还会探讨JSeparator类,他可以将菜单项目进行逻辑分组。我们将会了解如何通过使用JPopupMenu类来为JMenu被选中后出现的弹出菜单,或是任何组件的环境中提供支持。与抽象按钮类似,每一个菜单元素也有一个用于键盘选中的热键与其相关联。我们同进也会了解键盘快捷键支持,从而可以使得用记避免在多级菜单间进行遍历。
除了单个的菜单相关的组件之外,在本章中我们会了解JMenuBar选中模型以及菜单特定的事件相关类。我们要了解的选中模型接口是SingleSelectionModel接口,以及其默认实现DefaultSingleSelectionModel。我们将会探讨菜单特定的易做图以及事件MenuListener/MenuEvent,MenuKeyListener/MenuKeyEvent以及MenuDragMouseListener/MenuDragMouseEvent。另外,我们还会了解使用Popup与PopupFactory创建其他的弹出组件,以及通过JToolBar类使用工具栏。
6.1 使用菜单
我们先来了解一个演示菜单组件是如何组合在一起的示例。要开始我们的学习,创建一个具有菜单栏的窗体,如图6-1所示。
这个简单的菜单示例具有下列特性:
- 在菜单栏上是两个普通的菜单:File与Edit。在File菜单下,是我们较为熟悉的New,Open,Close与Exit。在Edit菜单下则是Cut,Copy,Paste与Find以及一个Find选项的子菜单。选项子菜单将包含查找方向子菜单--向前与向后--以及一个大小写敏感的开关。
- 在不同菜单的各种位置,菜单分隔符将选项分逻辑集合。
- 每一个菜单选项都具有一个相关联的热键,通过热键可以进行键盘浏览与选中。热键可以使得用户通过键盘进行菜单选择,例如,在Windows平台下通过按下Alt-F可以打开File菜单。
- 除了键盘热键,与多个选项相关联的击键可以作为键盘快捷键。与热键不同,快捷键可以直接激活一个菜单选项,甚至菜单选项并不可见时也是如此。
- 选项子菜单具有一个与其相关联的图标。尽管在图6-1中只显示了一个图标,所有的菜单组件都可以具有一个图标,除了JSpearator与JPopupMenu组件。
注意,对于这个示例,这些菜单选项并不会完成任何有意义的事情,仅是输出哪一个菜单选项被选中。例如,由Edit菜单中选中Copy选项会显示Selected: Copy。
列表6-1显示了图6-1中生成示例类的完整代码。
/**
*
*/
package net.ariel.ch06; import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent; import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.KeyStroke; /**
* @author mylxiaoyi
*
*/
public class MenuSample { static class MenuActionListener implements ActionListener {
public void actionPerformed(ActionEvent event ) {
System.out.println("Selected: "+event.getActionCommand());
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable runner = new Runnable() {
public void run() {
MenuActionListener menuListener = new MenuActionListener();
JFrame frame = new JFrame("Menu Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
menuBar.add(fileMenu); JMenuItem newMenuItem = new JMenuItem("New", KeyEvent.VK_N);
newMenuItem.addActionListener(menuListener);
fileMenu.add(newMenuItem); JMenuItem openMenuItem = new JMenuItem("Open", KeyEvent.VK_O);
openMenuItem.addActionListener(menuListener);
fileMenu.add(openMenuItem); JMenuItem closeMenuItem = new JMenuItem("Close", KeyEvent.VK_C);
closeMenuItem.addActionListener(menuListener);
fileMenu.add(closeMenuItem); fileMenu.addSeparator(); JMenuItem saveMenuItem = new JMenuItem("Save", KeyEvent.VK_S);
saveMenuItem.addActionListener(menuListener);
fileMenu.add(saveMenuItem); fileMenu.addSeparator(); JMenuItem exitMenuItem = new JMenuItem("Exit", KeyEvent.VK_X);
exitMenuItem.addActionListener(menuListener);
fileMenu.add(exitMenuItem); JMenu editMenu = new JMenu("Edit");
editMenu.setMnemonic(KeyEvent.VK_E);
menuBar.add(editMenu); JMenuItem cutMenuItem = new JMenuItem("Cut", KeyEvent.VK_T);
cutMenuItem.addActionListener(menuListener);
KeyStroke ctrlXKeyStroke = KeyStroke.getKeyStroke("control X");
cutMenuItem.setAccelerator(ctrlXKeyStroke);
editMenu.add(cutMenuItem); JMenuItem copyMenuItem = new JMenuItem("Copy", KeyEvent.VK_C);
copyMenuItem.addActionListener(menuListener);
KeyStroke ctrlCKeyStroke = KeyStroke.getKeyStroke("control C");
copyMenuItem.setAccelerator(ctrlCKeyStroke);
editMenu.add(copyMenuItem); JMenuItem pasteMenuItem = new JMenuItem("Paste", KeyEvent.VK_P);
pasteMenuItem.addActionListener(menuListener);
KeyStroke ctrlVKeyStroke = KeyStroke.getKeyStroke("control V");
pasteMenuItem.setAccelerator(ctrlVKeyStroke);
editMenu.add(pasteMenuItem); editMenu.addSeparator(); JMenuItem findMenuItem = new JMenuItem("Find", KeyEvent.VK_F);
findMenuItem.addActionListener(menuListener);
KeyStroke f3KeyStroke = KeyStroke.getKeyStroke("F3");
findMenuItem.setAccelerator(f3KeyStroke);
editMenu.add(findMenuItem); JMenu findOptionsMenu = new JMenu("Options");
Icon atIcon = new ImageIcon("at.gif");
findOptionsMenu.setIcon(atIcon);
findOptionsMenu.setMnemonic(KeyEvent.VK_O); ButtonGroup directionGroup = new ButtonGroup(); JRadioButtonMenuItem forwardMenuItem = new JRadioButtonMenuItem("Forward", true);
forwardMenuItem.addActionListener(menuListener);
forwardMenuItem.setMnemonic(KeyEvent.VK_F);
 
补充:软件开发 , Java ,