#java #chromium
#java #chromium
Вопрос:
Я пытался выяснить, есть ли способ использовать браузер Chromium в качестве пользовательского интерфейса для приложения Java. Я нашел эту страницу IntelliJ: https://jetbrains.org/intellij/sdk/docs/reference_guide/jcef.html Единственное, чего я не могу понять, так это как я на самом деле использую это в своем проекте. Моя версия IntelliJ — 2020.3, и в ней говорится, что в 2020.2 JCEF был включен по умолчанию. Однако я не могу понять, как я использую JCEF в своем проекте. Кажется, я не могу найти какой-либо четкой документации. Когда я пытаюсь импортировать, например, com.intellij, он не может найти пакет.
Существуют ли какие-либо учебные пособия или руководства по интеграции JCEF в мой проект IntelliJ?
Ответ №1:
- Вы можете запустить jetty server или использовать поставщика ресурсов. Пример поставщика ресурсов: https://medium.com/virtuslab/creating-intellij-plugin-with-webview-3b27c3f87aea
- Также в этом примере abstract 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')
}
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);
}
)
}
Комментарии:
1. в случае, когда в Linux jcef выбрасывает
[0827/153404.046731:FATAL:gpu_data_manager_impl_private.cc(439)] GPU process isn't usable. Goodbye.
Вы можете отключить графический процессор следующим кодом:class GpuDisabler: JBCefAppRequiredArgumentsProvider { override val options: List<String> get() = listOf("--disable-gpu", "--disable-gpu-compositing") } <extensions defaultExtensionNs="com.intellij"> <jcef.appRequiredArgumentsProvider implementation="com.icthh.xm.actions.GpuDisabler"/> </extensions>