创建Actions
创建Actions
用户通过定义和注册Action 可以实现添加菜单或按钮,步骤如下:可以参考示例:action_basics
创建Action
创建Action需要创建一个 AnAction 的子类,子类必须重写AnAction.actionPerformed() 方法,按需重写 AnAction.update() 方法
update() 方法可以启用或禁用 Action
actionPerformed() 执行业务逻辑
在action_basics 示例中的 PopupDialogAction 代码可以概括如下:
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没有注册,则提示如下图所示:
点击上图中的 Register Action 或快捷键(Alt+Shift+Enter ),打开向导,如下图:
如上图所示,该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> 标签配置的文本) :
通过 Help | Find Action... 搜索 Popup Dialog Action ,会显示该 Action 的默认 text
这时候执行该插件,由于 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_basics 中 PopupDialogAction 类中还重写了构造器,是用来动态创建Action的,一般情况下,不需要重写构造器
测试Action
运行该插件,将会弹出如下对话框: