IntelliJ Plugin 开发之 AnAction 运行原理(五)

在前面编写 Demo 项目时,我们邀请了 Action 大神出场,但貌似对他很陌生。本讲的主角就是他。

Action 有多神秘?官网文档地址:http://www.jetbrains.org/intellij/sdk/docs/basics/action_system.html

本文中,我会忽略一些技术不讲,比喻注册 Action GroupAction 代码方式注册等,几乎用不到。

Action 如何创建,前面也说过,请翻阅前面的 Hello World 那篇文章。

在 IntelliJ Platform,Action 组件主要用户接受用户的动作行为。我们开发时创建的 Action 都是派生自 AnAction。

在官方文档中,可以通过这个链接了解 AnAction 的源码,IDEA 中看到的源码都是混效果的。

核心方法:

1、actionPerformed():

在 AnAction 类中,有一个核心且必须实现的方法 actionPerformed,在选择菜单项或工具栏按钮时调用其方法。

回头看看前面的 Demo 文章,我为什么把 Messages.showDialog()  写在 actionPerformed 方法中?!

2、update():

IDEA 会定期的调用 AnAction 的 update() 方法,用户更新当前 Action 菜单的状态,比喻可见性、可操作性。

常见的观测状态比喻:项目是否被打开、是否有文件编辑器打开、选中文本等。

@Override
public void update(@NotNull AnActionEvent e) {
    super.update(e);
//    Project project = e.getData(PlatformDataKeys.PROJECT);
    Editor editor = e.getData(PlatformDataKeys.EDITOR);
    // 设置当前 action 菜单的可见性
    e.getPresentation().setVisible(editor == null);
    
    // 设置当前 action 菜单的可用性,
    // 如果不可用,则 actionPreformed() 方法收不到点击事件
    e.getPresentation().setEnabled(editor == null);
    
    // 同时设置当前 action 菜单的可见性和可用性
    e.getPresentation().setEnabledAndVisible(editor == null);
}

Action 的生命周期:

Action 与 Application 同生命周期(由系统会定期调用 update() 得知),所以不建议在 Action 的实例中保存短生命周期的对象,避免造成内存泄漏。

Action 相关的内容差不多就这些了,重点要注意两个核心方法的理解和使用。

接下来,我顺带介绍下 Action 中常用的一些 API:

1、前提:注意所有 Intellij Plugin 开发相关的 API,都是 com.intellij.openapi 包中的。

尤其是在写 Demo 时用到的 Messages,如果导错包,则找不到你想要的调用方法。

2、在 update 和 actionPerformed 方法中的形参 AnActionEvent ,其中提供了上下文信息和与当前项目有关的众多数据。

比喻:Project、Editor、Navigatable 等,可以动过 anActionEvent.getData() 方法获取,需要传递的参数为 PlatformDataKeys 类中的常量值。Demo 如前文代码。

Project:表示当前打开或者操作的 project,可以从中获取当前 project 的路径等数据。

Editor:编辑器对象。只有在打开了文件,且处于编辑模式时,此对象才会不为 null。好获取编辑器中选中的文本功能,就是从这个对象中获取的,后文会讲到。

差不多了。至此,你已经非常了解了 Action 的用法。继续关注后续文章,还有好戏等着你。

猜你喜欢

转载自blog.csdn.net/fesdgasdgasdg/article/details/85951794