Chapter 7.4 菜单、工具栏、对话框目标
·使用组件 JMenuBar,JMenu,JMenuItem、
JCheckBoxMenuItem和 JRadioButtonMenuItem 创建菜单。
·使用组件 JPopupMenu,JMenuItem、
JCheckBoxMenuItem和 JRadioButtonMenuItem创建弹出式菜单。
·使用 JToolBar类创建工具栏。
·使用 Action对象生成处理行为事件的代码
·使用 JOptionPane类创建标准对话框
·扩展 JDialog类来创建自定义对话框
·使用 JColorChooser类选择颜色。
·使用 JFileChooser类显示 Open File和 Save File对话框菜单 Menus
菜单能够简化选择,广泛应用于各种视窗应用程序。 Java提供五个实现菜单的类,JMenuBar,JMenu,JMenuItem,
JCheckBoxMenuItem,and JRadioButtonMenuItem
JMenuBar是最上层的菜单组件,用来存放菜单。菜单由用户选择的菜单项( menuItem)组成。菜单项是 JMenuItem,
JCheckBoxMenuItem,and JRadioButtonMenuItem 的实例。菜单项可以与图标、热键、快捷键等建立关联,可用分隔线分隔。
菜单栏 JMenuBar类
JFrame f = new JFrame();
f.setSize(300,200);
f.setVisible(true);
JMenuBar mb = new JMenuBar();
f.setJMenuBar(mb);
菜单栏( menuBar)能够安放菜单( menu),它只能添加到框架上。下列代码创建并添加一个菜单栏到框架上:
菜单 JMenu类
JMenu fileMenu = new JMenu("File",false);
JMenu helpMenu = new JMenu("Help",true);
mb.add(fileMenu);
mb.add(helpMenu);
可以将菜单 menu添加到菜单栏 menuBar,下列代码创建两个菜单 File和 Help,并将它们添加到菜单栏
mb中,
菜单项 JMenuItem类
fileMenu.add(new JMenuItem("new"));
fileMenu.add(new JMenuItem("open"));
fileMenu.addSeparator();
fileMenu.add(new JMenuItem("print"));
fileMenu.add(new JMenuItem("exit"));
fileMenu.addSeparator();
可以将菜单项添加到菜单中,下列代码创建菜单项并添加到菜单 fileMenu:
子菜单 Submenus
JMenu softwareHelpSubMenu = new JMenu("Software");
JMenu hardwareHelpSubMenu = new JMenu("Hardware");
helpMenu.add(softwareHelpSubMenu);
helpMenu.add(hardwareHelpSubMenu);
softwareHelpSubMenu.add(new JMenuItem("Unix"));
softwareHelpSubMenu.add(new JMenuItem("NT"));
softwareHelpSubMenu.add(new JMenuItem("Win95"));
可以将一个菜单嵌入到另一个菜单中,嵌入的菜单就成为子菜单,下列代码添加菜单项,Unix,”,NT,” and,Win95” 到子菜单
,Software.”
JCheckBoxMenuItem和 JRadioButtonMenuItem
helpMenu.add(new JCheckBoxMenuItem("Check it"));
JMenu colorHelpSubMenu = new JMenu("Color");
helpMenu.add(colorHelpSubMenu);
JRadioButtonMenuItem jrbmiBlue,jrbmiYellow,jrbmiRed;
colorHelpSubMenu.add(jrbmiBlue=new JRadioButtonMenuItem("Blue"));
colorHelpSubMenu.add(jrbmiYellow=new JRadioButtonMenuItem("Yellow"));
colorHelpSubMenu.add(jrbmiRed=new JRadioButtonMenuItem("Red"));
ButtonGroup btg =new ButtonGroup();
btg.add(jrbmiBlue);
btg.add(jrbmiYellow);
btg.add(jrbmiRed);
JRadioButtonMenuItem
JMenu colorHelpSubMenu = new JMenu("Color");
helpMenu.add(colorHelpSubMenu);
JRadioButtonMenuItem jrbmiBlue,jrbmiYellow,jrbmiRed;
colorHelpSubMenu.add(jrbmiBlue = new JRadioButtonMenuItem("Blue"));
colorHelpSubMenu.add(jrbmiYellow = new JRadioButtonMenuItem("Yellow"));
colorHelpSubMenu.add(jrbmiRed = new JRadioButtonMenuItem("Red"));
ButtonGroup btg = new ButtonGroup();
btg.add(jrbmiBlue);
btg.add(jrbmiYellow);
btg.add(jrbmiRed);
图标、热键和快捷键
上述菜单组件具有图标属性 icon和热键属性 mnemonic。例如,使用下面的代码可以给菜单项 New和 Open设置图标,并可以给菜单项 File
,Help,New和 Open设置热键:
JMenuItem jmiNew,jmiOpen;
fileMenu.add(jmiNew = new JMenuItem("New"));
fileMenu.add(jmiOpen = new JMenuItem("Open"));
jmiNew.setIcon(new ImageIcon("image/new.gif"));
jmiOpen.setIcon(new ImageIcon("image/open.gif"));
helpMenu.setMnemonic('H');
fileMenu.setMnemonic('F');
jmiNew.setMnemonic('N');
jmiOpen.setMnemonic('O');
jmiOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,ActionEvent.CTRL_MASK));
Example 7.4.1 使用菜单
问题,创建一个能进行算术运算的用户界面。界面包含操作数 Number1、操作数 Number2和运算结果 Result的标签和文本框。
MenuDemo
弹出式菜单 JPopupMenu
弹出式菜单也称为快捷菜单( context menu),很像普通菜单,但是它没有菜单栏,可以浮现在屏幕的任何地方。创建一个弹出式菜单与创建一个普通菜单类似。首先创建
JPopupMenu的实例,然后将 JMenuItem、
JCheckBoxMenuItem,JRadioButtonMenuItem 和分隔线添加到弹出式菜单。例如,以下代码创建弹出式菜单并且给它添加菜单项:
JPopupMenu jPopupMenu = new JPopupMenu();
JPopupMenu(new JMenuItem("New"));
JPopupMenu(new JMenuItem("Open"));
显示弹出式菜单
普通菜单总是通过 setJMenuBar方法附加到一个菜单栏上。而弹出式菜单总是使用 JPopupMenu类中的
show方法,与一个父组件建立关联并进行显示。要指定父组件和弹出式菜单的位置(采用父组件的坐标系统),使用下列语句:
jPopupMenu.show(component,x,y);
弹出触发开关
弹出式菜单通常包含与一个对象相关的命令。习惯上,指向对象并且单击某个鼠标键时显示弹出式菜单,这个鼠标键称为弹出触发开关,它是依赖于系统的。在 Windows系统中,当释放鼠标右键时显示弹出式菜单。
Example 7.4.2 使用弹出式菜单
Problem,在滚动窗格中创建一个文本区域。
当鼠标指向文本区域时,就会触发弹出触发开关并显示弹出式菜单。
PopupMenuDemo
工具栏 JToolBar
在用户界面中,工具栏通常用于存放菜单中的命令。为了进行快速访问,将一些常用的命令存放到工具栏上。在工具栏上单击一个命令要比从菜单中选择快得多。
swing提供的 JToolBar类用作存放工具栏组件的容器。默认情况下,JToolBar使用 BoxLayout管理器对组件进行管理。
工具栏组件通常是以图标的形式出现的,由于图标并不是组件,所以,它们不能直接放到工具栏上。因此,可以在工具栏上放置按钮,然后再把图标设置在按钮上。
JToolBar类的以下属性是经常使用的:
– orientation指出工具栏上的组件项是水平还是垂直显示。取值是
JToolBar.HORIZONTAL和 JToolBar.VERTICAL。默认是水平。
– floatable指明工具栏是否可以浮动,默认可以浮动。
Example 7.4.3 使用工具栏问题,创建一个工具栏,包含三个带图标的按钮,用来表示命令 New,Open和 Print
ToolBarDemo
使用 Action 接口处理行为事件
通常,菜单和工具栏都包含一些通用行为。 Swing
提供 Action接口,利用它可以创建处理行为的
Action对象。使用 Action对象,可以集中处理通用行为。并且可以把它从其他应用代码中分离出来

Action接口 ActionListener的一个子接口,如下图所示
ActionListener,Action,and AbstractAction
ja va x.s wi ng,Ac ti o n
+ ge tVa l ue( k ey,St r i ng ),O bj ect
+ isE n ab le d( ),b oo le a n
+ p ut V a lu e( ke y,St r in g,v al ue,O bj ec t),vo id
+ s et E n a bl e d( b,b o ol ea n),v oi d
G e ts o ne o f t h is o b je ct 's pr o pe r ti e s us i ng t he as s o c ia te d ke y,
Re tu r ns t r ue i f ac ti o n i s e na bl e d,
A s s o ci at e s a ke y /v al ue pai r w it h t he a ct io n,
E na bl e s o r di s abl e s t he ac ti o n,
ja va,a wt,ev en t,A ct i on L ist en er
j a v a x,s w i n g,A b st r a c t Ac t i o n
+ A b st r a c t A c t i o n ( )
+ A b st r a c t A c t i o n ( n a m e,S t r i n g )
+ A b st r a c t A c t i o n ( n a m e,S t r i n g,i c o n,I c o n )
+ g e t K e y s( ),O b j e c t [ ]
D e f i n e s a n A c t i o n o b j e c t w i t h a d e f a u l t d e scri p t i o n s t r i n g a n d d e f a u l t
i c o n,
D e f i n e s a n A c t i o n o b j e c t w i t h t h e sp e c i f i e d d e scri p t i o n st r i n g a n d a
d e f a u l t i c o n,
D e f i n e s a n A c t i o n o b j e c t w i t h t h e sp e c i f i e d d e scri p t i o n st r i n g a n d t h e
sp e c i f i e d i c o n,
R e t u r n s a n a r r a y o f o b j e c t s w h i c h a r e k e y s fo r w h i c h v a l u e s h a v e b e e n
se t f o r t h i s A b st r a c t A c t i o n,o r n u l l i f n o k e y s h a v e v a l u e s se t,
j a v a x,s w i n g,Ac t i o n
AbstractAction 是 Action接口的默认实现,除了 actionPerformed方法外,它实现了 Action的所有方法,另外定义了 getKeys()方法
Action 接口是 ActionListener接口的一个有用扩展,以便多种控制能够访问同一功能创建一个 Action 实例
由于 AbstractAction是一个抽象类,因此,不能用构造方法创建实例
。但是,可以创建它的一个具体子类并实现 actionPerformed方法,为方便,这个子类可以定义为匿名内部类。
Action exitAction = new AbstractAction("Exit") {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
};
某些容器,比如 JMenu和 JToolBar,知道如何添加一个 Action对象。当一个 Action对象添加到这样的容器中时,该容器自动地为该 Acion对象创建一个合适的组件,并且注册一个监听器。
jMenu.add(exitAction);
jToolBar.add(exitAction);
关联 Action 实例到 Buttons
有些 Swing组件,如 JButton,JRadioButton,and JCheckBox
包含利用 Action对象创建实例的构造方法,
JButton jbt = new JButton(exitAction);
关联 Action 实例和 Keystrokes
Action 对象也可以与热键和快捷键建立关联,要建立行为与热键的关联,使用下列语句:
exitAction.putValue(Action.MNEMONIC_KEY,new Intege(KeyEvent.VK_E));
要建立行为与快捷键的关联,使用下列语句:
KeyStroke exitKey =
KeyStroke.getKeyStroke(KeyEvent.VK_E,KeyEvent.CTRL_MASK);
exitAction.putValue(Action.ACCELERATOR_KEY,exitKey);
Example 7.4.4 使用 Actions
问题,创建如下图所示界面,菜单项、工具栏按钮和面板上普通按钮的行为,能够通过使用 Action接口的通用行为处理器进行处理。
ActionInterfaceDemo
JOptionPane对话框我们曾经使用 JOptionPane创建输入对话框。本节将给出 JOptionPane和其他对话框的综合介绍。对话框通常用作临时窗口,用来接收用户的附加信息或者提供某事件发生的通知。 Java提供用于创建标准对话框的 JOptionPane类。用户也可以通过扩展 JDialog类创建自定义对话框。
一个 JOptionPane对话框包含,an icon,a
message,an input,and
option buttons.
消息对话框消息对话框显示信息提醒用户,并等待用户单击
OK按钮关闭对话框。以下是创建消息对话框:
JOptionPane.showMessageDialog(null,“This is an error",
“Error",JOptionPane.INFORMATION_MESSAGE);
Message Types
参数 messageType 取下列常量之一,
JOptionPane.ERROR_MESSAGE
JOptionPane.INFORMATION_MESSAGE
JOptionPane.PLAIN_MESSAGE
JOptionPane.WARNING_MESSAGE
JOptionPane.QUESTION_MESSAGE
确认对话框消息对话框显示信息并等待用户单击 OK按钮退出对话框,但不能返回任何值。确认对话框提出一个问题,并要求用户选择适当的按钮。确认对话框返回所选择按钮对应的值:
public static int showConfirmDialog(Component parentComponent,
object message,
String title,
int optionType,
int messageType,
Icon icon)
参数 parentComponent,message,title,messageType与消息对话框一样。参数 optionType决定在对话框中显示哪些按钮,其可能的值为:
JOptionPane,DEFAULT_OPTION,YES_NO_OPTION,YES_NO_CANCEL_OPTION
,OK_CANCEL_OPTION。
方法返回下列 int值,对应于用户选择的按钮:
JOptionPane.YES_OPTION,NO_OPTION,CANCEL_OPTION,OK_OPTION、
CLOSED_OPTION。
输入对话框输入对话框用来接受用户的输入。可以从文本框中输入,
或者从组合框、列表框中进行选择。备选值可以用一个数组指定,其中任一值可以设定为初始的备选值。如果创建输入对话框时没有设置备选值,输入对话框就会采用文本框进行输入;如果指定的备选值少于 20个,输入对话框就会采用组合框;如果指定的备选值多于或等于 20个,则输入对话框就会采用列表框输入对话框(续)
Public static String showInputDialog(Object message)
Public static String showInputDialog(Component
parentComponent,Object message)
Public static String showInputDialog(Component
parentComponent,Object message)
Public static String showInputDialog(Component
parentComponent,Object message,String title,int
messageType)
Public static Object showInputDialog(Component
parentComponent,Object message,String title,int
messageType,Icon icon,Object[] selectionValues,
Object initialSelectionValue)
选项对话框
选项对话框允许用户创建自定义按钮。可以使用下列方法创建选项对话框:
– Public static int showOptionDialog(Component parentComponent,
Object message,String title,int optionType,int messageType,Icon
icon,Object[] options,Object initialValue)
使用 options参数来指定按钮。参数 initialValue允许指定初始接受焦点的按钮。方法返回一个 int值,表示激活的按钮
,如果用户关闭了对话框,则返回 CLOSED_OPTION 。
Example 7.4.5 创建 JOptionPane 对话框问题,该程序提示用户从一个输入对话框的列表框中选择年利率,从一个输入对话框的组合框中选择,从一个输入对话框中输入贷款总额。在消息对话框内的
JScrollPane中使用文本区显示还贷计划表。
JOptionPaneDemo
创建自定义对话框
在大多数情况下,标准的 JOptionPane对话框就足够用了。
但有时还需要创建自定义对话框。在 Swing中,可以扩展
JDialog类来创建自定义对话框。
与使用 JFrame一样,可以将组件添加到 JDialog的内容窗格中。创建自定义对话框通常需要在对话框中摆放用户界面组件、放置关闭对话框的按钮,并安装响应按钮行为事件的监听器。
标准对话框是模式的,即指在关闭对话框之前不能访问其他窗口。但是,在默认情况下,从 JDialog中派生的自定义对话框不是模式的。要使对话框变成模式的,需要将其属性 modal置为 true。要显示 JDialog的实例,将其属性 visible置为 true。
Example 7.4.6 创建自定义对话框问题,创建一个用于选择颜色的自定义对话框,
如下图所示。
ColorDialog
颜色对话框 JColorChooser
在前面的例子中用 JDialog的子类创建了一个颜色对话框,
而 JDialog是 java.awt.Dialog(一个顶层的重型组件)的一个子类。因此它不能作为组件添加到容器中。颜色对话框在 GUI
程序设计中应用非常普通。 Swing提供一个方便且功能完善的颜色对话框,名为 javax.swing.JColorChooser。它是从
JComponent继承而来的轻型组件,可以添加到任何容器中。
使用 JColorChooser
使用构造方法创建实例
new JColorChooser();
显示一个 JColorChooser对话框
public static Color showDialog(Component parentComponent,
String title,Color initialColor)
showDialog方法创建了 JDialog的一个实例,用来放置
JColorChooser对象,该实例带有三个按钮 OK,Cancel
和 Reset,如图。这个方法显示的对话框是模式的。
文件对话框 JFileChooser
javax.swing.JFileChooser类显示一个对话框,通过它用户可以浏览文件系统,可以选择文件进行装入或保存。与JColorChooser一样,JFileChooser也是从 JComponent继承而来的轻型组件。需要的话它可以添加到任何容器中,但是
,通常创建 JFileChooser实例并且单独显示。
使用 JFileChooser
JFileChooser是 JComponent的一个子类。有几种方法可以创建文件对话框,其中最简单的是使用无参构造方法。
文件对话框可以以两种类型显示:打开或保存,这两种对话框都是模式的。
显示打开文件对话框,
public int showOpenDialog(Component parent)
返回 int型值,也可以是 APPROV_OPTION或者
CANCEL_ OPTION,表示单击的是 OK按钮还是
Cancel按钮。
显示保存对话框,
public int showSaveDialog(Component parent)
使用 JFileChooser
JFileChooser类继承了 JComponent的属性,它还有下列几种有用的属性:
– dialogType指定对话框类型。选项,OPEN_DIALOG、
SAVE_DIALOG
– dialogTitle对话框标题
– currentDirectory是文件的当前目录。该属性的类型是
java.io.File。如果要使用当前目录,则调用
setCurrentDirectory(new File(“.”))方法
– selectedFile是指已经选定的文件。可以使用
getSelectedFile()方法返回从对话框中选定的文件。也可调用 setSelectedFile(File file)选定文件
– selectedFiles是所选文件的列表,此时要求文件选择器允许进行多项选择。该属性的类型为文件数组 File[]
– multiSelectionEnabled是一个布尔型值,指出是否允许选择多个文件。在默认状态下,它的值是 false。
Example 7.4.7 Creating a Text Editor
问题,使用 Swing菜单、工具栏、文件选择器和颜色选择器,创建一个简单的文本编辑器,该编辑器允许用户打开和保存文本文件、清空文件、以及改变文件的颜色和字体。
TextEditor