【问题标题】:How do I use JCEF with Intellij?如何将 JCEF 与 Intellij 一起使用?
【发布时间】:2020-12-28 16:22:24
【问题描述】:

我一直试图弄清楚是否有一种方法可以将 Chromium 浏览器用作 Java 应用程序的 UI。我找到了这个 IntelliJ 页面:https://jetbrains.org/intellij/sdk/docs/reference_guide/jcef.html 我无法弄清楚我是如何在我的项目中实际使用它的。我的 IntelliJ 版本是 2020.3,它说在 2020.2 中默认启用 JCEF。但是,我无法弄清楚如何在我的项目中使用 JCEF。我似乎找不到任何明确的文件。例如,当我尝试导入 com.intellij 时,它找不到包。

是否有任何教程或指南可以将 JCEF 集成到我的 IntelliJ 项目中?

【问题讨论】:

    标签: java chromium


    【解决方案1】:
    1. 您可以运行码头服务器或使用资源提供者。 资源提供者示例: https://medium.com/virtuslab/creating-intellij-plugin-with-webview-3b27c3f87aea

    2. 这个抽象 WebDialog 的例子也解释了如何将数据传递给 fe: https://github.com/sergeysenja1992/xm-online-idea-plugin/blob/master/src/main/kotlin/com/icthh/xm/actions/WebDialog.kt

    后端类 BrowserPipe (WebDialog.kt 文件)中的所有魔法,以及前端类中的相同类 https://github.com/sergeysenja1992/xm-online-idea-plugin/blob/master/src/main/webapp/src/index.html

    下一个 js 文件是魔法的一部分

     <script src="http://registercallback/events.js"></script>
    

    这个js文件不存在,但是监听这个请求并返回生成的js代码。

    CefApp.getInstance().registerSchemeHandlerFactory("http", "registercallback", InjectJsHandlerFactory(inject()))
    

    更多详情请查看(WebDialog.kt 文件)中的这行代码

    在所有操作之后,我有能力以简单的方式编写组件: FE:https://github.com/sergeysenja1992/xm-online-idea-plugin/blob/master/src/main/webapp/src/app/settings/settings.component.ts

      constructor(private zone: NgZone) {
        let w: any = window;
        w.messagePipe.subscribe('initData', (res) => {
          console.info('initData', res);
          zone.run(() => {
            this.updateData(res);
          });
        });
        w.messagePipe.post('componentReady', 'SettingsComponent ready')
      }
    

    BE:https://github.com/sergeysenja1992/xm-online-idea-plugin/blob/master/src/main/kotlin/com/icthh/xm/actions/settings/SettingsDialog.kt

    override fun callbacks(): List<BrowserCallback> {
        val data = ArrayList(project.getSettings().envs.map { it.copy() })
        this.data = data;
        return listOf(
            BrowserCallback("componentReady") {body, pipe ->
                logger.info("Update ${body}")
                pipe.post("initData", mapper.writeValueAsString(mapOf(
                    "updateModes" to updateModes,
                    "branches" to project.getRepository().getLocalBranches(),
                    "envs" to data,
                )))
            },
            BrowserCallback("envsUpdated") {body, pipe ->
                logger.info("envsUpdated ${body}")
                val envs = mapper.readValue<List<EnvironmentSettings>>(body)
                this.data = ArrayList(envs);
            }
        )
    }
    

    【讨论】:

    • in case when on linux jcef throw [0827/153404.046731:FATAL:gpu_data_manager_impl_private.cc(439)] GPU process isn't usable. Goodbye. 你可以通过下一个代码禁用 gpu:class GpuDisabler: JBCefAppRequiredArgumentsProvider { override val options: List&lt;String&gt; get() = listOf("--disable-gpu", "--disable-gpu-compositing") } &lt;extensions defaultExtensionNs="com.intellij"&gt; &lt;jcef.appRequiredArgumentsProvider implementation="com.icthh.xm.actions.GpuDisabler"/&gt; &lt;/extensions&gt;
    猜你喜欢
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2013-04-14
    • 2019-02-03
    • 1970-01-01
    • 2015-03-19
    • 2021-06-08
    • 2016-07-12
    相关资源
    最近更新 更多