前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IDEA Web渲染插件开发(一)— 使用JCEF

IDEA Web渲染插件开发(一)— 使用JCEF

作者头像
w4ngzhen
发布于 2023-10-16 13:57:03
发布于 2023-10-16 13:57:03
2.2K01
代码可运行
举报
文章被收录于专栏:编译思想编译思想
运行总次数:1
代码可运行

目前网上已经有了很多关于IDEA(IntelliJ平台)的插件开发教程了,本人觉得简书上这位作者秋水畏寒 的关于插件开发的文章很不错,在我进行插件开发的过程中指导了我很多。但是综合下来看,在IDEA上加载网页的插件的教程还不是特别多,官方文档也不是那么的完整。本系列将会从这个角度出发,探讨如何编写加载Web页面的插件。

前言

为什么会有想到开发处理Web网页的插件呢?实际上因为在IDEA中,我们可以打开markdown文件,并且IDEA具有markdown实时渲染的能力:

因为之前,本人使用过JCEF进行开发。看到这个渲染,心里大概猜测,应该用了浏览器内核。打开任务管理器:

果然,熟悉的JCEF。然后进入JetBrains的官网,在插件开发的文档中找到了:JCEF - Java Chromium Embedded Framework | IntelliJ Platform Plugin SDK (jetbrains.com)

那么,接下来我们从零开始,编写一款属于自己的插件,这款插件能够加载Web页面。

环境准备

  • JDK 11
  • Gradle
  • 良好的网络环境

我们先创建一个IntelliJ Platform Plugin,名为:intellij-jcef-plugin

然后进行这个Gradle项目的配置工作,完成整个项目搭建。本项目会在最后提交到github供读者下载。

代码编写

首先说明我们的目的,就是希望能够类似于gradle、maven插件一样,能够在IDEA的侧边有一个显示我们Web页面的地方:

通过阅读官方的文档我们可以知道,我们需要编写的是ToolWindow(Tool Windows | IntelliJ Platform Plugin SDK (jetbrains.com))这样一个页面窗体。

基础ToolWindow开发

在开发之前,我们需要明确一点,尽管这一节的标题写着"空白ToolWindow开发",似乎在暗示我们,接下来我们会开发一个所谓的ToolWindow的实现类。实际上,ToolWindow是插件框架本身提供的,我们只需要做的是创建UI组件(例如JPanel),然后调用ToolWindow实例通过相关的API帮我们把UI组件设置到ToolWindow内部,具体的步骤如下:

实现ToolWindowFactory

创建一个ToolWindowFactory的实现类,这里我们取名MyToolWindowFactory,然后重写createToolWindowContent方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyToolWindowFactory implements ToolWindowFactory {
    @Override
    public void createToolWindowContent(
            @NotNull Project project,
            @NotNull ToolWindow toolWindow) {
        // 此处方法将会在点击ToolWindow的时候触发
        // 获取ContentManager
        ContentManager contentManager = toolWindow.getContentManager();
        Content labelContent =
                contentManager.getFactory() // 内容管理器获取工厂类
                        .createContent( // 创建Content(组件类实例、显示名称、是否可以锁定)
                                new JLabel("hello, world"),
                                "MyTab",
                                false
                        );
        // 利用ContentManager添加Content
        contentManager.addContent(labelContent);
    }
}

在重写的createToolWindowContent方法中,插件框架会为我们传入两个对象:Project以及ToolWindow对象。其中,Project对象是当前项目的内容抽象,而ToolWindow这个对象就是插件框架本身内部构造的,抽象了我们需求所说的,点击侧边栏时候弹出的页面。

在该方法实现中,主要有以下步骤:

  1. 使用ContentFactory(ContentManager.getFactory()获取)的createContentAPI创建Content对象。这个创建时候,需要swing组件对象(JPanel、JLabel等等)。
  2. 使用ContentManager的addContentAPI添加步骤1的Content对象。

注册插件

接下来,我们将我们实现的MyToolWindowFactory通过plugin.xml进行注册,alt+enter,IDEA帮助我们快速完成填写xml配置到plugin.xml中:

进行上述操作后,IDEA自动为我们在plugin.xml文件的extensions节点中,添加了toolWindow节点的内容,但是我们还需要填写必备的属性id

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- plugin.xml文件 -->
    <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
        <!-- id是必须的属性,我们进行添加 -->
        <!-- anchor锚点非必须,但是为了像Gradle插件一样默认显示在右边,我们设置为right -->
        <toolWindow id="myToolWindowFactory"
                    anchor="right"
                    factoryClass="com.compilemind.demo.ui.MyToolWindowFactory"
        />
    </extensions>

解决调试环境问题

目前为止,我们实现了ToolWindowFactory以及将我们的实现类注册到plugin.xml中。现在,我们先什么内容都不编写,开始调试我们的插件:

不过开始调试后,会有很多的情况发生,这里我做了一些遇到的问题的总结。

Gradle乱码

此时进行Debug调试,在我的机器上会出现乱码:

解决方案为,在build.gradle中添加如下的语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
Gradle报错不知道这样的主机(Unknown host)

如果出现了类似于Unknown host 'xxxxx.cloudfront.net'. You may need to adjust the proxy settings in Gradle.这样的报错,一般是当前网络的连通问题,导致无法下载cloudfront.net一些jar文件。此时挂代理是最好的办法。

rumIde:Download JCEF

如果使用调试模式,intellij插件开发的Gradle插件会下载jcef的运行时,这个过程会比较漫长,目前解决办法是使用好的网络等待下载:

在本人机器上,第一次调试的时候主要就是遇到上面的三种情况。

验证基础ToolWindow

解决完上述的几个问题之后,界面弹出了我们的调试下的社区版的IDEA(ideaIC),并且,查看Plugins页签,会发现我们编写的插件已经被这个ideaIC安装了:

我们使用这个IDEA创建一个简单的空项目,然后可以看到右侧有我们提供的ToolWindow:

可以看到,此时的ToolWindow中的内容显示为我们上面设置的new JLabel("hello, world"),该ToolWindow上方有我们设置的"My Tab"标题。截至目前的代码,包含在这个github上这个提交:

simple ToolWindow Content · w4ngzhen/intellij-jcef-plugin@bf2ca8e (github.com)

Web页面ToolWindow开发

通过上面一些系列的环境搭建,以及ToolWindow开发练习,我们已经了解了如何开发一款用于IDEA侧边栏展示内容的插件。当然,我们一开始的需求是要在ToolWindow中展示网页,并且也知道了,JetBrains已经将JCEF引入到了IntelliJ插件平台。接下来,我们使用JCef以及JBCef相关API创建一个用于展示Web的UI组件,再通过上述的方式,添加到ToolWindow。

创建MyWebToolWindowContent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.compilemind.demo.ui;

import com.intellij.ui.jcef.JBCefApp;
import com.intellij.ui.jcef.JBCefBrowser;

import javax.swing.*;
import java.awt.*;

public class MyWebToolWindowContent {

    private final JPanel content;

    /**
     * 构造函数
     */
    public MyWebToolWindowContent() {
        this.content = new JPanel(new BorderLayout());
        // 判断所处的IDEA环境是否支持JCEF
        if (!JBCefApp.isSupported()) {
            this.content.add(new JLabel("当前环境不支持JCEF", SwingConstants.CENTER));
            return;
        }
        // 创建 JBCefBrowser
        JBCefBrowser jbCefBrowser = new JBCefBrowser();
        // 将 JBCefBrowser 的UI控件设置到Panel中
        this.content.add(jbCefBrowser.getComponent(), BorderLayout.CENTER);
        // 加载URL
        jbCefBrowser.loadURL("https://cnblogs.com/w4ngzhen");
    }

    /**
     * 返回创建的JPanel
     * @return JPanel
     */
    public JPanel getContent() {
        return content;
    }
}

修改MyToolWindowFactory

这里,我们将创建MyWebToolWindowContent实例,然后返回其Panel,按同样的方式设置到ToolWindow中。

验证Web渲染ToolWindow

上述代码完成开发后,我们再次运行Debug模式,可以看到此时的界面显示了相关的网页:

附录

本次代码本人放在了Github上,地址为:w4ngzhen/intellij-jcef-plugin (github.com)

上面基础ToolWindow开发以及web页面ToolWindow开发两节的内容,按如下提交对应:

基础ToolWindow开发 :simple ToolWindow Content · w4ngzhen/intellij-jcef-plugin@bf2ca8e (github.com)

web页面ToolWindow开发:web ToolWindow Content · w4ngzhen/intellij-jcef-plugin@45604d3 (github.com)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-162,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
IDEA Web渲染插件开发(二)— 自定义JsDialog
《IDEA Web渲染插件开发(一)》中,我们了解到了如何编写一款用于显示网页的插件,所需要的核心知识点就是IDEA插件开发和JCEF,在本文中,我们将继续插件的开发,为该插件的JS Dialog显示进行自定义处理。
w4ngzhen
2023/10/16
9970
IDEA Web渲染插件开发(二)— 自定义JsDialog
《IntelliJ IDEA 插件开发》第二节:开发摸鱼看书的侧边栏窗体
总有人拿到产品的需求,就着急开干,反正也懒的想开发中会发生啥,上线后多少人使用,管它三七二十一先堆起来代码看一看,反正能跑就行,无论代码还是你!
小傅哥
2021/11/04
4.5K2
技术调研,IDEA 插件怎么开发「脚手架、低代码可视化编排、接口生成测试」?
你觉得肯德基全家桶是什么?一家人一起吃的桶吗,就那么一点点?不是,肯德基全家桶说的是,鸡的全家桶!
小傅哥
2021/09/14
1.6K0
《IntelliJ IDEA 插件开发》第三节:开发工具栏和Tab页,展示股票行情和K线
以前,我不懂。写的技术就是技术内容,写的场景就是场景分析,但从读者的阅读我发现,大家更喜欢的是技术与场景结合,尤其是用技术结合那些羞羞答答的场景,虽然嘴上都不说。
小傅哥
2021/11/19
2.5K0
IntelliJ IDEA/Android Studio插件开发指南
目前在为安卓手机QQ做自动化的相关工作,包括UI自动化,逻辑层自动化等。使用到的uiautomator等框架,需要在Android Studio进行编码工作。 其中很多工作如果做到插件化的话,可以有效地节省时间成本,提升大家的自动化效率。 比如运行自动化的时候,需要用到我们自定义的shell命令。我们可以通过插件来实现一键运行。 在运行adb shell am instrument命令的时候,需要编译出test APK和target APK。手Q整体的git仓库很大,编译耗时很久。我们想着通过一些方法来优化这个耗时。其中一个步骤就是,把我们代码目录下的变更,同步到一个编译目录下。 这个小功能的最合适的形态,自然就是Android Studio上的一个插件。点击一个按钮,一键同步,那可真是在米奇妙妙屋吃妙脆角——妙到家了! Android Studio是基于Intellij IDEA开发的,所以开发Android Studio的插件,其实就是开发IDEA的插件。 根据官方推荐,使用IDEA IDE来开发IDEA插件。
于果
2021/08/25
2.7K0
idea插件开发记录
插件开发示例 ---- 功能开发代码示例 java package com.cjl.plugins.code.hints; import com.cjl.plugins.code.code.NavigatorPanel; import com.cjl.plugins.code.http.HttpUtils; import com.cjl.plugins.code.json.Json; import com.intellij.codeInsight.hint.HintManager; import com.
司夜
2023/03/31
7490
idea插件开发记录
《IntelliJ IDEA 插件开发》第一节:两种方式创建插件工程
对于码农这一行业的编程学习生涯来说,会遇到很多的不会,不会搭建IDEA工程、不会写老师的案例、不会完成书中的效果、不会做项目的需求、不会实现复杂的逻辑、不会抽象工程的结构等等。但这些不会当中并不是所有的不会,都因为太复杂学不会,而是很大一部分内容因为找不到好的资料、没有清晰的文档、缺少完整的案例,导致不知道所以不会。
小傅哥
2021/10/20
3.1K0
你们要的Intellij IDEA 插件开发秘籍,来了!
王昭霞,软件开发工程师,先后从事脚本工具编写、工具开发、Android基础模块开发等工作。
京东技术
2018/09/28
57.1K13
你们要的Intellij IDEA 插件开发秘籍,来了!
IDEA插件开发.02之“异味”代码收集插件
许久没更新IDEA插件开发系列了。最近刚好在汇总日常开发中常见的代码“异味”,共享文档复制黏贴略显麻烦,所以想着是否可以搞一个IDEA插件来帮忙收集常见代码,毕竟IDEA作为后端程序员必备的开发工具,显然会方便很多。
有一只柴犬
2024/01/25
1740
IDEA插件开发.02之“异味”代码收集插件
idea插件开发指南_idea get set插件
gitee地址:https://gitee.com/jyq_18792721831/studyplugin.git idea插件开发入门 idea插件开发–配置 idea插件开发–服务-翻译插件 idea插件开发–组件–编程久坐提醒
全栈程序员站长
2022/11/10
5.9K0
idea插件开发指南_idea get set插件
第一款Goland的SCA插件开发之旅
插件开发,是一件即快乐又痛苦的事情。快乐的是你可以根据自己的需求通过插件来进行实现,比如经常看到的 Chrome 的插件开发。插件对于应用的原生生态有着很大的益处,往往那些特别优秀的插件甚至会被官方收编或者在正式功能中加入插件的功能。痛苦的是你需要去看文档,看插件开发的各种文档,如果文档不详细的话,痛苦加倍。程序猿最讨厌的事就是看别人的文档以及自己写文档。当然,除了文档,作为小白你还会踩到各种各样的坑。
madneal
2022/06/07
1.6K0
第一款Goland的SCA插件开发之旅
IDEA插件开发
IDEA中内置多种插件,使我们在代码的开发过程中更加方便快捷。本文对环境配置和基础插件开发进行了讲解说明。
算法与编程之美
2022/01/04
1.8K0
IDEA插件开发
基于IDEA的自动化代码审计插件开发初探
然后本文主要是给大家介绍一下怎么实现一个IDEA静态代码检测插件,现在都在讲安全左移嘛,我觉得静态代码检测插件就是一个安全左移很好的落地,于是就想着学习一下
tnt阿信
2021/04/26
1.9K0
基于IDEA的自动化代码审计插件开发初探
Intellij IDEA--Android Studio插件开发
项目需求,需要开发IDE的插件,没开始之前以为会是个很麻烦和困难的事情,开始动手后发现其实步骤也就那么几步。 我平时主要使用的开发IDE就是android studio和pycharm。 本文主要介绍如何开发自己的Android Studio插件。Android Studio本来就是基于IDEA开发的,要开发AS的插件j就是基于IntelliJ IEDA的插件开发。
languageX
2021/01/26
2.8K0
从零开始编写IntelliJ IDEA插件
https://www.cnblogs.com/kancy/p/10654569.html
用户3519280
2023/07/07
8320
从零开始编写IntelliJ IDEA插件
Intellij IDEA 插件开发之自建插件仓库
Intellij IDEA 有一个自己的官方的插件仓库,但是当我们的开发的 Intellij IDEA 的插件不能够对外公开时,我们就需要搭建自己的 Intellij IDEA 的插件仓库。前不久我们也尝试着使用Intellij IDEA自己开发一个插件点击打开链接。
用户8704998
2021/06/07
2.2K0
Idea插件开发
https://www.w3cschool.cn/intellij_idea_doc/
码客说
2024/08/04
3730
Idea插件开发
《IntelliJ IDEA 插件开发》第四节:扩展创建工程向导步骤,开发DDD脚手架
你做这个东西的价值是什么?有竞品调研吗?能赋能业务吗?那不已经有同类的了,你为什么还自己造轮子?
小傅哥
2021/12/01
1.2K0
《IntelliJ IDEA 插件开发》第四节:扩展创建工程向导步骤,开发DDD脚手架
Intellij IDEA 插件开发之自建插件仓库
Intellij IDEA 有一个自己的官方的插件仓库,但是当我们的开发的 Intellij IDEA 的插件不能够对外公开时,我们就需要搭建自己的 Intellij IDEA 的插件仓库。前不久我们也尝试着使用Intellij IDEA自己开发一个插件点击打开链接。 搭建 Intellij IDEA 插件仓库 Intellij IDEA 的官方文档里面有提到怎么去新建一个插件仓库,但是,这部分的文档却不在 Intellij IDEA 插件的开发文档里面,而是在插件相关功能的使用文档里面:https://w
xiangzhihong
2018/02/05
4.9K0
Intellij IDEA 插件开发之自建插件仓库
IntelliJ插件开发-京东工程师教你改造你的IDE
王帅廷,京东 Android高级开发工程师,6年以上开发经验,对设计框架有着深刻的认识,负责京东商城研发工具的开发,设计并完成了多个IntelliJ插件的开发工作。
京东技术
2018/07/30
3.3K1
IntelliJ插件开发-京东工程师教你改造你的IDE
推荐阅读
相关推荐
IDEA Web渲染插件开发(二)— 自定义JsDialog
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验