创建Actions

走着路睡觉大约 4 分钟

创建Actions

用户通过定义和注册Action 可以实现添加菜单或按钮,步骤如下:可以参考示例:action_basicsopen in new window

创建Action

创建Action需要创建一个 AnActionopen in new window 的子类,子类必须重写AnAction.actionPerformed() 方法,按需重写 AnAction.update() 方法

  • update() 方法可以启用或禁用 Action

  • actionPerformed() 执行业务逻辑

action_basicsopen in new window 示例中的 PopupDialogActionopen in new window 代码可以概括如下:

public class PopupDialogAction extends AnAction {

  @Override
  public void update(@NotNull AnActionEvent event) {
    //启用或禁用Action
  }

  @Override
  public void actionPerformed(@NotNull AnActionEvent event) {
    // 业务逻辑
    // 例如,创建或显示一个对话框
  }
}

注意

AnAction的子类不能有任何类型的成员变量,这是因为 AnAction 子类的实例和应用程序生命周期相同。如果AnAction 子类使用成员变量存储了某些数据,但是没有及时清除,将会发生数据泄漏。

要想让上面的代码生效,需要先注册该 Action ,见下文:

注册Action

这部分介绍了如何使用向导注册Action,以及手动修改Action属性

使用向导注册Action

IDEA 可以自动检测 Action 是否已经注册,如果没有提示,可以在Settings/Preferences | Editor | Inspections | Plugin DevKit | Code | Component/Action not registered 中打开检测开关,见下图:

action_never_used

如果Action没有注册,则提示如下图所示:

action_never_used

点击上图中的 Register Action 或快捷键(Alt+Shift+Enter ),打开向导,如下图:

new_action.png

如上图所示,该Action将会显示在 Tools 菜单中的第一个,点击 OK ,在 plugin.xml 文件里将会注册该 Action, 如下所示:

<actions>
  <action
      id="org.intellij.sdk.action.PopupDialogAction"
      class="org.intellij.sdk.action.PopupDialogAction"
      text="Popup Dialog Action"
      description="SDK action example">
    <add-to-group group-id="ToolsMenu" anchor="first"/>
  </action>
</actions>

配置更多属性

<action
    id="org.intellij.sdk.action.PopupDialogAction"
    class="org.intellij.sdk.action.PopupDialogAction"
    text="Action Basics Plugin: Popup Dialog Action"
    description="SDK action example"
    icon="SdkIcons.Sdk_default_icon"> <!--图标-->
    
<!--    IDE 2020.1版本支持,当该Action配置到 MainMenu 显示时,名称显示为:Popup Dialog Action-->
<!--    配置到其它地方显示的时候,名称显示为它上面配置的默认text:Action Basics Plugin: Popup Dialog Action-->
  <override-text place="MainMenu" text="Popup Dialog Action"/>
    <!--键盘快捷键-->
  <keyboard-shortcut  
      keymap="$default"
      first-keystroke="control alt A"
      second-keystroke="C"/>
<!--    鼠标快捷键 -->
  <mouse-shortcut
      keymap="$default"
      keystroke="control button3 doubleClick"/>
  <add-to-group group-id="ToolsMenu" anchor="first"/>
</action>

测试Action

完成上面的几步后,运行该插件,可以在 Tools 菜单中看到该 Action (名称显示为 <override-text> 标签配置的文本) :

new_action.png

通过 Help | Find Action... 搜索 Popup Dialog Action ,会显示该 Action 的默认 text

new_action.png

这时候执行该插件,由于 actionPerformed() 方法未开发业务,所以什么也不会发生

开发AnAction

通过上面几步,已经完成了 Action 的注册,通过下面几步开发具体业务逻辑

继承 actionPerformed() 方法

该方法负责处理业务逻辑,下面代码的业务逻辑是:如果用户执行了该操作(Action),将会弹出一个显示当前选择的元素名称的消息框

@Override
public void actionPerformed(@NotNull AnActionEvent event) {
  //创建并显示对话框
  Project currentProject = event.getProject();
  StringBuilder message =
      new StringBuilder(event.getPresentation().getText() + " Selected!");
  //如果选中了一个元素,追加该元素的信息
  Navigatable selectedElement = event.getData(CommonDataKeys.NAVIGATABLE);
  if (selectedElement != null) {
    message.append("\nSelected Element: ").append(selectedElement);
  }
  String title = event.getPresentation().getDescription();
  Messages.showMessageDialog(
      currentProject,
      message.toString(),
      title,
      Messages.getInformationIcon());
}

继承update()方法

该方法负责控制该Action 的可用性和可见性,根据当前上下文,会动态改变该Action 的状态。

注意

AnAction.update() 方法将在 UI 线程上频繁调用。该方法必须很快的执行,不要执行耗时长的业务操作

下列示例中,如果当前存在 Project对象,则激活该Action ,如果不存在Project对象,则隐藏并禁用该Action

@Override
public void update(@NotNull AnActionEvent event) {
  // 至少打开一个项目,此action才会启用
  Project currentProject = event.getProject();
  event.getPresentation().setEnabledAndVisible(currentProject != null);
}

其它方法

示例action_basicsopen in new windowPopupDialogAction 类中还重写了构造器,是用来动态创建Action的,一般情况下,不需要重写构造器

测试Action

运行该插件,将会弹出如下对话框:

new_action.png

上次编辑于:
贡献者: zhaojingbo
Loading...