如何使用动作
Action可用于将功能和状态与组件分开。例如,如果您有两个或多个执行相同功能的组件,请考虑使用Action
对象来实现该功能。 Action
对象是action listener,它不仅提供动作事件处理功能,而且还集中处理动作事件触发组件(例如工具栏按钮,menu items,common buttons和text fields)的状态。动作可以处理的状态包括文本,图标,助记符,已启用和选定状态。
通常,您可以使用setAction
方法将操作附加到组件。在组件上调用setAction
时,会发生以下情况:
-
组件的状态将更新为与
Action
的状态匹配。例如,如果设置了Action
的文本和图标值,则组件的文本和图标将设置为这些值。 -
Action
对象已注册为组件上的操作侦听器。 -
如果
Action
的状态更改,则组件的状态将更新为与Action
匹配。例如,如果您更改操作的启用状态,则它所连接的所有组件都将更改其启用状态以匹配该操作。
这是创建执行相同功能的工具栏按钮和菜单项的示例:
Action leftAction = new LeftAction(); //LeftAction code is shown later
...
button = new JButton(leftAction)
...
menuItem = new JMenuItem(leftAction);
要创建Action
对象,通常需要创建AbstractAction的子类,然后实例化它。在子类中,必须实现actionPerformed
方法以在动作事件发生时做出适当的反应。这是创建和实例化AbstractAction
子类的示例:
leftAction = new LeftAction("Go left", anIcon,
"This is the left button.",
new Integer(KeyEvent.VK_L));
...
class LeftAction extends AbstractAction {
public LeftAction(String text, ImageIcon icon,
String desc, Integer mnemonic) {
super(text, icon);
putValue(SHORT_DESCRIPTION, desc);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
displayResult("Action for first button/menu item", e);
}
}
将由前面的代码创建的动作附加到按钮和菜单项时,该按钮和菜单项将显示与该动作关联的文本和图标。 L
字符用于按钮和菜单项上的助记符,其工具提示文本设置为SHORT_DESCRIPTION
字符串,后跟助记键的表示形式。
例如,我们提供了一个简单的示例ActionDemo.java,它定义了三个动作。每个动作都附加到按钮和菜单项上。由于为每个按钮的动作设置了助记符值,所以按键序列Alt-L
激活了左按钮,Alt-M
激活了中间按钮,Alt-R
激活了右按钮。左按钮的工具提示显示这是左按钮。 Alt-L.所有这些配置都是自动进行的,无需程序显式调用设置助记符或工具提示文本。正如我们将在后面显示的那样,该程序确实进行了调用以设置按钮文本,但是只是避免使用动作已经设置的值。
Try this:
-
单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ActionDemo。或者,要自己编译并运行示例,请参考example index。
-
从左侧菜单中选择顶部的项( 菜单>左移 )。
文本区域显示一些文本,标识事件源和接收事件的动作侦听器。 -
单击工具栏中最左侧的按钮。
文本区域再次显示有关事件的信息。请注意,尽管事件的来源不同,但是两个事件都是由相同的动作侦听器检测到的:与组件连接的Action
对象。 -
从“操作状态”菜单中选择顶层项目。
这将禁用“向左移动”Action
对象,该对象又会禁用其关联的菜单项和按钮。
这是禁用“向左走”操作时用户看到的内容:
以下是禁用“向左移动”操作的代码:
boolean selected = ...//true if the action should be enabled;
//false, otherwise
leftAction.setEnabled(selected);
使用Action
创建组件后,可能需要自定义它们。例如,您可能想通过添加或删除图标或文本来自定义组件之一的外观。例如,ActionDemo.java的菜单中没有图标,按钮中也没有文本。这是完成此操作的代码:
menuItem = new JMenuItem();
menuItem.setAction(leftAction);
menuItem.setIcon(null); //arbitrarily chose not to use icon in menu
...
button = new JButton();
button.setAction(leftAction);
button.setText(""); //an icon-only button
通过选择将 icon 属性设置为null
并将文本设置为空字符串,我们选择了通过同一操作创建仅图标按钮和仅文本菜单项。但是,如果Action
的属性发生更改,则小部件可能会try再次重置Action
中的图标和文本。
Action API
下表列出了常用的Action
构造函数和方法。使用Action
对象的 API 分为三类:
Class | Purpose |
---|---|
AbstractButton | |
JComboBox JTextField | 这些组件及其子类可能具有通过setAction 直接分配给它们的操作。有关通常与动作相关联的组件的更多信息,请参见工具栏按钮,menu items,common buttons和text fields的各节。有关每个组件从Action 获取的属性的详细信息,请参阅相关类的configurePropertiesFromAction方法的 API 文档。另请参见buttonActions表。 |
构造函数或方法 | Purpose |
---|---|
AbstractAction() | |
AbstractAction(String) AbstractAction(String, Icon) | 创建Action 对象。通过参数,您可以指定要在动作所附加的组件中使用的文本和图标。 |
void setEnabled(boolean) boolean isEnabled() | 设置或获取是否启用了动作控件的组件。调用setEnabled(false) 将禁用该操作控制的所有组件。类似地,调用setEnabled(true) 将启用操作的组件。 |
void putValue(String,Object) Object getValue(String) | 设置或获取与指定键关联的对象。用于设置和获取与操作关联的属性。 |
该表定义了可以在操作上设置的属性。第二列列出了哪些组件会自动使用属性(以及专门调用的方法)。例如,在随后附加到菜单项的动作上设置ACCELERATOR_KEY
意味着JMenuItem.setAccelerator(KeyStroke)
被自动调用。
Property | Auto-Applied to: Class (调用的方法) | Object | |
---|---|---|---|
ACCELERATOR_KEY | JMenuItem (* setAccelerator *) | 用作动作加速器的KeyStroke 。有关加速器与助记符的讨论,请参见启用键盘操作。 | 。 |
ACTION_COMMAND_KEY | AbstractButton ,JCheckBox ,JRadioButton (* setActionCommand *) | 与ActionEvent 关联的命令字符串。 | |
LONG_DESCRIPTION | 无 | 动作的详细说明。可以用于上下文相关的帮助。 | |
MNEMONIC_KEY | AbstractButton ,JMenuItem ,JCheckBox ,JRadioButton (* setMnemonic *) | 动作的助记符。有关加速器与助记符的讨论,请参见启用键盘操作。 | 。 |
NAME | AbstractButton ,JMenuItem ,JCheckBox ,JRadioButton (* setText *) | 动作的名称。您可以在使用AbstractAction(String) 或AbstractAction(String, Icon) 构造函数创建操作时设置此属性。 | |
SHORT_DESCRIPTION | AbstractButton ,JCheckBox ,JRadioButton (* setToolTipText *) | 动作的简短描述。 | |
SMALL_ICON | AbstractButton ,JMenuItem (* setIcon *) | 工具栏或按钮上使用的操作图标。您可以在使用AbstractAction(name, icon) 构造函数创建操作时设置此属性。 |
使用动作的示例
以下示例使用Action
个对象。
Example | Where Described | Notes |
---|---|---|
ActionDemo | This section | 使用动作将按钮和菜单项绑定到同一功能。 |
TextComponentDemo | Literals 组件功能 | 使用文本操作来创建用于文本编辑命令(例如剪切,复制和粘贴)的菜单项,以及将击键绑定到插入符号移动。还实现自定义AbstractAction 子类以实现撤消和重做。Literals 动作讨论始于概念:关于编辑器套件。 |