我如何将 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 项目中的任何教程或指南?
您可以运行码头服务器或使用资源提供程序。
资源提供者示例:
https://medium.com/virtuslab/creating-intellij-plugin-with-webview-3b27c3f87aea
这个抽象 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')
}
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);
}
)
}
我一直在尝试找出是否可以使用 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 项目中的任何教程或指南?
您可以运行码头服务器或使用资源提供程序。 资源提供者示例: https://medium.com/virtuslab/creating-intellij-plugin-with-webview-3b27c3f87aea
这个抽象 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')
}
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);
}
)
}