如何使用动作

Action可用于将功能和状态与组件分开。例如,如果您有两个或多个执行相同功能的组件,请考虑使用Action对象来实现该功能。 Action对象是action listener,它不仅提供动作事件处理功能,而且还集中处理动作事件触发组件(例如工具栏按钮menu itemscommon buttonstext 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.所有这些配置都是自动进行的,无需程序显式调用设置助记符或工具提示文本。正如我们将在后面显示的那样,该程序确实进行了调用以设置按钮文本,但是只是避免使用动作已经设置的值。

ActionDemo 的快照,该快照使用动作来协调菜单和按钮。

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ActionDemo。或者,要自己编译并运行示例,请参考example index

  • 从左侧菜单中选择顶部的项( 菜单>左移 )。
    文本区域显示一些文本,标识事件源和接收事件的动作侦听器。

  • 单击工具栏中最左侧的按钮。
    文本区域再次显示有关事件的信息。请注意,尽管事件的来源不同,但是两个事件都是由相同的动作侦听器检测到的:与组件连接的Action对象。

  • 从“操作状态”菜单中选择顶层项目。
    这将禁用“向左移动” Action对象,该对象又会禁用其关联的菜单项和按钮。

这是禁用“向左走”操作时用户看到的内容:

ActionDemo 的快照ActionDemo 的快照

以下是禁用“向左移动”操作的代码:

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 分为三类:

支持 set/getAction 的组件

ClassPurpose
AbstractButton

JComboBox
JTextField
这些组件及其子类可能具有通过setAction直接分配给它们的操作。有关通常与动作相关联的组件的更多信息,请参见工具栏按钮menu itemscommon buttonstext fields的各节。有关每个组件从Action获取的属性的详细信息,请参阅相关类的configurePropertiesFromAction方法的 API 文档。另请参见buttonActions表。

创建和使用 AbstractAction

构造函数或方法Purpose
AbstractAction()

AbstractAction(String)
AbstractAction(String, Icon)
创建Action对象。通过参数,您可以指定要在动作所附加的组件中使用的文本和图标。
void setEnabled(boolean)
boolean isEnabled()
设置或获取是否启用了动作控件的组件。调用setEnabled(false)将禁用该操作控制的所有组件。类似地,调用setEnabled(true)将启用操作的组件。
void putValue(String,Object)
Object getValue(String)
设置或获取与指定键关联的对象。用于设置和获取与操作关联的属性。

Action Properties

该表定义了可以在操作上设置的属性。第二列列出了哪些组件会自动使用属性(以及专门调用的方法)。例如,在随后附加到菜单项的动作上设置ACCELERATOR_KEY意味着JMenuItem.setAccelerator(KeyStroke)被自动调用。

PropertyAuto-Applied to:
Class
(调用的方法)
Object
ACCELERATOR_KEYJMenuItem
(* setAccelerator *)
用作动作加速器的KeyStroke。有关加速器与助记符的讨论,请参见启用键盘操作。
ACTION_COMMAND_KEYAbstractButtonJCheckBoxJRadioButton
(* setActionCommand *)
ActionEvent关联的命令字符串。
LONG_DESCRIPTION动作的详细说明。可以用于上下文相关的帮助。
MNEMONIC_KEYAbstractButtonJMenuItemJCheckBoxJRadioButton
(* setMnemonic *)
动作的助记符。有关加速器与助记符的讨论,请参见启用键盘操作。
NAMEAbstractButtonJMenuItemJCheckBoxJRadioButton
(* setText *)
动作的名称。您可以在使用AbstractAction(String)AbstractAction(String, Icon)构造函数创建操作时设置此属性。
SHORT_DESCRIPTIONAbstractButtonJCheckBoxJRadioButton
(* setToolTipText *)
动作的简短描述。
SMALL_ICONAbstractButtonJMenuItem
(* setIcon *)
工具栏或按钮上使用的操作图标。您可以在使用AbstractAction(name, icon)构造函数创建操作时设置此属性。

使用动作的示例

以下示例使用Action个对象。

ExampleWhere DescribedNotes
ActionDemoThis section使用动作将按钮和菜单项绑定到同一功能。
TextComponentDemoLiterals 组件功能使用文本操作来创建用于文本编辑命令(例如剪切,复制和粘贴)的菜单项,以及将击键绑定到插入符号移动。还实现自定义AbstractAction子类以实现撤消和重做。Literals 动作讨论始于概念:关于编辑器套件