我如何将 JCEF 与 Intellij 一起使用?

How do I use JCEF with Intellij?

我一直在尝试找出是否可以使用 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 项目中的任何教程或指南?

  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

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

下一个 js 文件,它是 magic 的又一部分

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

此js文件不存在,但会监听此请求并return生成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')
  }

英语: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);
        }
    )
}