工具栏是现代用户界面中主程序窗口的主要部分。工具栏向用户提供了对于常用命令的简单访问,这通常构建为层次结构的菜单结构。支持这种功能的Swing组件就是JToolBar。
JToolBar是一个种存放组件的特殊Swing容器。这个容器可以在我们的Java Applet或是程序中用作工具栏,而且可以在程序的主窗口之外浮动或是托拽。JToolBar是一个非常容易使用与理解的简单组件。
一旦我们拥有一个JToolBar,我们需要向其中添加组件。任意的Component都可以添加到工具栏。当处理水平工具栏时,由于美观的原因,如果工具栏的组件是大致相同的高度时是最好的。对于垂直工具栏,如果工具栏组件具有大致相同的宽度则是最好的。JToolBar类只定义了一个方法用于添加工具栏项目;其他的方法,例如add(Component)是由Container继承而来的。另外,我们可以向工具栏添加分隔符。
当使用JToolBar的add(Action)方法时,所添加的Action被封闭在一个JButton对象中。这与向JMenu或是JPopupMenu组件添加Action不同,在后一种情况中,所添加的是JMenuItem对象。对于JMenu与JPopupMenu,以这种方式添加Action是类的Javadoc中所不推荐的。对于分隔符,如果我们没有指定尺寸,所安装的观感会强制默认的尺寸设置。
6.3.3 JToolBar属性
表6-15列出了JToolBar所定义的9个属性。
JToolBar属性
属性名
|
数据类型
|
访问性 |
accessibleContext
|
AccessibleContext
|
只读 |
borderPainted
|
boolean
|
读写绑定 |
floatable
|
boolean
|
读写绑定 |
layout
|
LayoutManager
|
只写 |
margin
|
Insets
|
读写绑定 |
orientation
|
int
|
读写绑定 |
rollover
|
boolean
|
读写绑定 |
UI
|
ToolBarUI
|
读写 |
UIClassID
|
String
|
只读 |
在默认情况下绘制JToolBar的边框。如果我们不希望绘制边框,我们可以将borderPainted属性设置为false。如果不使用borderPainted属性,我们需要修改border属性(由超类JComponent继承的属性)。
orientation属性只可以设置为JToolBar的HORIZONTAL或是VERTICAL常量。如果使用其他的值,则会抛出IllegalArgumentException。修改方向会改变工具栏的布局管理器。如果我们通过setLayout()方法直接修改布局管理器,改变方向会撤销我们的布局管理器。
正如前面所提到的,默认情况下工具栏是可浮动的。这就意味着用户可以拖动工具栏并放置在其他位置。要拖动工具栏,用户选择工具栏的空白部分。然后工具栏可以停留在原始的程序窗口,在主窗口内部浮动,或者是拖动到原始程序窗口的其他部分。如果原始窗口的布局管理器是BorderLayout,可拖动的部分是布局管理器无组件的边。(我们不能将工具栏放在窗口的中央。)否则,工具栏会被拖动到容器的最后一个点上。图6-10显示了拖动与停放过程的不同阶段。
rollover属性定义了当用户在工具栏的不同组件上移动时与观感特定的行为。这种行为涉及到颜色与边框的不同。
6.3.4 处理JToolBar事件
并没有特定于JToolBar的事件。我们需要将监听器关联到我们需要响应用户交互的JToolBar上的每一项上。当然,JToolBar是一个Container,所以我们也可以监听其事件。
6.3.5 自定义JToolBar观感
每一个可安装的Swing观感都提供了其自己的JToolBar外观以及默认的UIResource值集合。外观的大部分是由工具栏中的实际组件控制的。图6-11显示了预安装的观感类型集合Motif,Windows以及Ocean的JToolBar组件外观。每一个工具栏都有五个JButton组件,在第四个与第五个组件之间有一个分隔符。
表6-16中列出了JToolBar的UIResource相关的属性。对于JToolBar组件,有22个不同的属性。
JToolBar UIResource元素
|
属性字符串 |
对象类型 |
ToolBar.actionMap |
ActionMap |
ToolBar.ancestorInputMap |
InputMap |
ToolBar.background |
Color |
ToolBar.border |
Border |
ToolBar.borderColor |
Color |
ToolBar.darkShadow |
Color |
ToolBar.dockingBackground |
Color |
ToolBar.docingForeground |
Color |
ToolBar.floatingBackground |
Color |
ToolBar.floatingForeground |
Color |
ToolBar.font |
Font |
ToolBar.foreground |
Color |
ToolBar.handleIcon |
Icon |
ToolBar.highlight |
Color |
ToolBar.isRollover |
Boolean |
ToolBar.light |
Color |
ToolBar.nonrolloverBorder |
Border |
ToolBar.rolloverBorder |
Border |
ToolBar.separatorSize |
Dimension |
ToolBar.shadow |
Color |
ToolBarSeparatorUI |
String |
ToolBarUI |
String |
6.3.6 完整的JToolBar使用示例
列表6-8演示了一个完整的JToolBar示例,这个程序生成了一个带有多个菱形按钮的工具栏。这个程序同时重用了本章前面列表6-2中为菜单示例所定义的ShowAction。
在这个示例中允许了rollover属性以演示当前观感的不同。图6-12是我们在不同的按钮上移动鼠标时的输出结果。
- package net.ariel.ch06; import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Container;
- import java.awt.EventQueue;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener; import javax.swing.Action;
- import javax.swing.Icon;
- import javax.swing.JButton;
- import javax.swing.JFrame;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.JToolBar; import net.ariel.ch04.DiamondIcon; public class ToolBarSample { private static final int COLOR_POSITION = 0;
- private static final int STRING_POSITION = 1;
- static Object buttonColors[][] = {
- {Color.RED, "RED"},
- {Color.BLUE, "BLUE"},
- {Color.GREEN, "GREEN"},
- {Color.BLACK, "BLACK"},
- null, // separator
- {Color.CYAN, "CYAN"}
- }; public static class TheActionListener implements ActionListener {
- public void actionPerformed(ActionEvent event) {
- System.out.println(event.getActionCommand());
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub Runnable runner = new Runnable() {
- public void run() {
- JFrame frame = new JFrame("JToolBar Example");
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- ActionListener actionListener = new TheActionListener(); JToolBar toolbar = new JToolBar();
- toolbar.setRollover(true); for(Object[] color: buttonColors) {
- if(color == null) {
- toolbar.addSeparator();
- }
- else {
- Icon icon = new DiamondIcon((Color)color[COLOR_POSITION], true, 20, 20);
- JButton button = new JButton(icon);
- button.setActionCommand((String)color[STRING_POSITION]);
- button.addActionListener(actionListener);
- toolbar.add(button);
- }
- }
- Action action = new ShowAction(frame);
- JButton button = new JButton(action);
- toolbar.add(button); Container contentPane = frame.getContentPane();
- contentPane.add(toolbar, BorderLayout.NORTH);
- JTextArea textArea = new JTextArea();
- JScrollPane pane = new JScrollPane(textArea);
- contentPane.add(pane, BorderLayout.CENTER);
- frame.setSize(350, 150);
- frame.setVisible(true);
- }
- };
- EventQueue.invokeLater(runner);
- } }
6.3.7 JToolBar.Separator类
JToolBar维护其自己的分隔符从而允许自定义JToolBar上的分隔符的观感。
这个分隔符是我们调用JToolBar的addSeparator()方法时自动创建的。另外,如果我们希望手动创建这个组件,则有两个方法可以创建JToolBar.Separator。
- public JToolBar.Separator()
- JSeparator toolBarSeparator = new JToolBar.Separator();
- public JToolBar.Separator(Dimension size)
- Dimension dimension = new Dimension(10, 10);
- JSeparator toolBarSeparator = new JToolBar.Separator(dimension);
这两个构造函数都创建一个水平分隔符。我们可以配置其尺寸。如果我们没有指定尺寸,观感类型会决定分隔符的尺寸。
与JPopupMenu.Separator类似,如果我们希望修改分隔符的方向,我们必须调用由JSeparator所继承的setOrientation()方法,此时的参数为JToolBar.Separator.VERTICAL。
6.4 小结
本章介绍了许多Swing菜单相关的类及其内部关系,以及Swing工具栏类。首先,我们了解了JMenuBar及其选择模型,并且了解了菜单栏如何应用在Applets以及程序中。
接下来,我们探讨了JMenuItem,这是用户选择的菜单元素,以及系统用来处理事件的两个新的事件/监听器对,MenuKeyEvent/MenuKeyListener以及MenuDragMouseEvent/MenuDragMouseListener。然后,我们探讨了JMenu组件,这是JMenuItem实放置的地方,及其新的事件/监听器对,MenuEvent/MenuListener,这可以用来确定菜单何时将会发送。
接下来,我们了解了JSeparator组件以及我们如何可以将其作为一个菜单分隔符或是菜单外的可视分隔符。
然后我们探讨了JPopupMenu,JMenu用其来显示其JMenuItem组件集合。对于JPopupMenu,我们了解了弹出菜单自己的事件/监听器对,PopupMenuEvent/PopupMenuListener。
然后我们探讨了JCheckBoxMenuItem与JRadioButtonMenuItem中的可选择的菜单元素,以及MenuElement接口,同时我们了解了如何创建自定义的菜单组件。
菜单并不是唯一可以弹出的内容,所以我们探讨了Popup与PopupFactory。最后,本章探讨了JToolBar类。
在第7章中,我们将会了解Swing提供的用来自定义Swing组件周围边框的不同类。