12.2.5 使用JToolBar创建工具条
12.2.5 使用JToolBar创建工具条
构造器
Swing提供了JToolBar类来创建工具条:
| 方法 | 描述 | 
|---|---|
| JToolBar() | Creates a new tool bar; orientation defaults to HORIZONTAL. | 
| JToolBar(int orientation) | Creates a new tool bar with the specified orientation. | 
| JToolBar(String name) | Creates a new tool bar with the specified name. | 
| JToolBar(String name, int orientation) | Creates a new tool bar with a specified name and orientation. | 
创建JToolBar对象时可以指定如下两个参数:
- name:该参数指定该工具条的名称
- orientation:该参数指定该工具条的方向。
JToolBar常用方法
一旦创建了JToolBar对象之后,JToolBar对象还有如下几个常用方法:
| 方法 | 描述 | 
|---|---|
| JButton add(Action a) | 通过 Action对象为JToolBar添加对应的工具按钮。 | 
| void addSeparator() | 添加一个默认大小的分隔符 | 
| void addSeparator(Dimension size) | 向工具条中添加指定大小的分隔符 | 
| void setFloatable(boolean b) | 设置该工具条是否可浮动,即该工具条是否可以拖动 | 
| void setMargin(Insets m) | 设置工具条边框和工具按钮之间的页边距 | 
| void setOrientation(int o) | 设置工具条的方向 | 
| void setRollover(boolean rollover) | 设置此工具条的 rollover状态 | 
Action接口
上面的大多数方法都比较容易理解,比较难以理解的是add方法,系统如何为工具条添加Action对应的按钮呢?
Action接口是ActionListener接口的子接口,它除包含ActionListener接口的actionPerformed()方法之外,还包含name和icon两个属性,其中name用于指定按钮或菜单项中的文本,而icon则用于指定按钮的图标或菜单项中的图标。也就是说,Action不仅可作为事件监听器使用,而且可被转换成按钮或菜单项。
值得指出的是,Action本身并不是按钮,也不是菜单项,只是当把Action对象添加到某些容器(也可直接使用Action来创建按钮),如菜单和工具栏中时,这些容器会为该Action对象创建对应的组件(菜单项和按钮)。也就是说,这些容器需要负责完成如下事情。
- 创建一个适用于该容器的组件(例如,在工具栏中创建一个工具按钮)
- 从Action对象中获得对应的属性来设置该组件(例如,通过name来设置文本,通过icon来设置图标)。
- 检查Action对象的初始状态,确定它是否处于激活状态,并根据该Action的状态米决定其对应所有组件的行为。只有处于激活状态的Action所对应的Swing组件才可以响应用户动作。
- 通过Action对象为对应组件注册事件监听器,系统将为该Action所创建的所有组件注册同一个事件监听器(事件处理器就是Action对象里的actionPerformed方法)
程序
例如,程序中有一个菜单项、一个工具按钮,还有一个普通按钮都需要完成某个“复制”动作,程序就可以将该“复制”动作定义成Action,并为之指定name和icon属性,然后通过该Action来创建菜单项、工具按钮和普通按钮,就可以让这三个组件具有相同的功能。另一个“粘贴”按钮也大致相似,而且“粘贴”组件默认不可用,只有当“复制”组件被触发后,且剪贴板中有内容时才可用。
| 1 | import java.awt.*; | 
上面程序中创建了pasteAction、copyAction两个Action,然后根据这两个Action分别创建了按钮、工具按钮、菜单项组件,开始时pasteAction处于非激活状态,则该Action对应的按钮、工具按钮、菜单项都处于不可用状态。运行上面程序,会看到如图12.7所示的界面

图12.7显示了工具条被拖动后的效果,这是因为工具条默认处于浮动状态。除此之外,程序中 2 号代码设置了工具条和工具按钮之间的页边距,所以可以看到工具条在工具按钮周围保留了一些空白区域。