事件监听,我们最熟悉不过的就是开发APP时,监听按钮点击事件、手指触摸及移动事件、网络状态事件等等。事件监听大多通过观察者模式实现,首先API调用者不需要知道后台是如何检测出网络状态不可用的,而只需要向系统注册一个监听器,当网络状态发生改变时,由系统回调给监听器。
站在用户的角度思考问题,与客户深入沟通,找到兴县网站设计与兴县网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站建设、成都网站制作、企业官网、英文网站、手机端网站、网站推广、域名注册、网站空间、企业邮箱。业务覆盖兴县地区。
本篇内容:
如何监听项目或模块改变事件
首先是项目级别的事件监听。添加一个项目管理事件监听器,我们需要实现ProjectManagerListener接口,该接口有四个方法,其源码如下。
- public interface ProjectManagerListener extends EventListener {
- default void projectOpened(@NotNull Project project) {
- }
- default void projectClosed(@NotNull Project project) {
- }
- default void projectClosing(@NotNull Project project) {
- }
- default void projectClosingBeforeSave(@NotNull Project project) {
- }
- }
有了项目管理事件监听器之后,我们如何注册该监听器呢?
有两种方法,一种是代码方式注册,一种是在plugin.xml插件配置文件中注册。
代码方式注册可调用ProjectManager.getInstance().addProjectManagerListener();方法注册,但这种方式注册有一个弊端,就是无法监听到项目打开事件,projectOpened方法不会被调用,应该在我们能够调用该方法注册监听器时,项目实际已经打开了。
所以注册项目管理监听器我们只能通过修改plugin.xml配置文件方式注册,配置代码如下:
- topic="com.intellij.openapi.project.ProjectManagerListener"/>
当我们给IDEA注册自定义的项目管理事件监听器后,我们就可以通过项目管理事件监听器注册其它的事件监听器,例如注册模块监听事件,这是因为模块的事件触发在项目打开事件触发之后才会触发。因此,在projectOpened方法中可注册任何其它的事件监听器。
注册模块事件监听器代码如下:
- project.getMessageBus().connect()
- .subscribe(ProjectTopics.MODULES, new ModuleListener(){});
subscribe方法需要两个参数:
ModuleListener接口的定义如下:
- public interface ModuleListener extends EventListener {
- default void moduleAdded(@NotNull Project project, @NotNull Module module) {
- }
- default void beforeModuleRemoved(@NotNull Project project, @NotNull Module module) {
- }
- default void moduleRemoved(@NotNull Project project, @NotNull Module module) {
- }
- default void modulesRenamed(@NotNull Project project, @NotNull List
modules, @NotNull Function oldNameProvider) { - }
- }
如何监听文件编辑事件
通过前面两篇的学习,我们已经了解什么是PSI,知道一个文件对应一个PsiFile,一个PsiFile本身也是一个PsiElement,由许多的PsiElement构成,每个PsiElement也都可以有子PsiElement。
因此,监听文件改变事件其实就是监听PSI树的结构改变事件,我们需要通过PsiManager注册PsiTreeChangeListener,代码如下。
- PsiManager.getInstance(project).addPsiTreeChangeListener(
- new PsiTreeChangeListener() {
- // .....
- }, FILES::clear);
至于注册时机,视情况而定,可以在Service初始化时注册,可以在AnAction触发时注册,也可以在projectOpened事件方法中注册。
PsiTreeChangeListener接口定义的方法较多,可以分为两类事件,一类是before事件、一类是after事件,接口源码如下。
- public interface PsiTreeChangeListener extends EventListener {
- void beforeChildAddition(@NotNull PsiTreeChangeEvent event);
- void beforeChildRemoval(@NotNull PsiTreeChangeEvent event);
- void beforeChildReplacement(@NotNull PsiTreeChangeEvent event);
- void beforeChildMovement(@NotNull PsiTreeChangeEvent event);
- void beforeChildrenChange(@NotNull PsiTreeChangeEvent event);
- void beforePropertyChange(@NotNull PsiTreeChangeEvent event);
- void childAdded(@NotNull PsiTreeChangeEvent event);
- void childRemoved(@NotNull PsiTreeChangeEvent event);
- void childReplaced(@NotNull PsiTreeChangeEvent event);
- void childrenChanged(@NotNull PsiTreeChangeEvent event);
- void childMoved(@NotNull PsiTreeChangeEvent event);
- void propertyChanged(@NotNull PsiTreeChangeEvent event);
- }
最后
“编写一个IDEA插件”系列暂时就写这些,因为对这方面感兴趣的读者可能比对汇编语言感兴趣的读者还少。其实这几篇分析的也是笔者写插件过程中用到的一些笔者认为非常重要的知识点,当然还有很多没分享,如果要继续写,估计还可以写几篇,但看到上篇的阅读量就没动力继续写下去了。
参考:
本文转载自微信公众号「Java艺术」,可以通过以下二维码关注。转载本文请联系Java艺术公众号。
分享文章:编写一个IDEA插件之:事件监听
网页路径:http://www.mswzjz.cn/qtweb/news27/498827.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能