# JCEF - Java Chromium 嵌入式框架
自己理解:
就是 swing界面里面, 添加 chrome类似的 微博view
*****
> JCEF 自 2020.1 起作为**实验性功能**可用。我们计划在 3rd 方插件中弃用 JavaFX,并在 2020.2 中切换到 JCEF。要在 2020.2 或更高版本中继续使用 JavaFX,必须添加对[JavaFX Runtime for Plugins](https://plugins.jetbrains.com/plugin/14250-javafx-runtime-for-plugins)的显式依赖。另请参阅[IntelliJ 平台中的 JavaFX 和 JCEF](https://blog.jetbrains.com/platform/2020/07/javafx-and-jcef-in-the-intellij-platform/)博客文章[以](https://blog.jetbrains.com/platform/2020/07/javafx-and-jcef-in-the-intellij-platform/)获取计划摘要。
<br>
JCEF 是[CEF](https://bitbucket.org/chromiumembedded/cef/wiki/Home)框架的 Java 端口,用于在使用 Swing 的应用程序中嵌入[基于 Chromium 的浏览器](https://www.chromium.org/Home)。
在 IDE 中嵌入浏览器组件允许:
* 呈现 HTML 内容
* 预览生成的 HTML(例如,来自 Markdown)
## [启用 JCEF](https://plugins.jetbrains.com/docs/intellij/jcef.html#enabling-jcef)
<br>
2020.2 及更高版本
> JCEF 自 2020.2 起默认可用并启用
## [调试](https://plugins.jetbrains.com/docs/intellij/jcef.html#debugging)
嵌入到 JCEF 中的[Chrome DevTools](https://developers.google.com/web/tools/chrome-devtools/)可用作调试和分析工具。默认情况下它处于活动状态,因此 Chrome DevTools 客户端可以通过默认端口号连接到它 -`9222`。可以使用以下注册表项配置端口号:
`ide.browser.jcef.debug.port=9222`
<br>
因此,IntelliJ IDEA Ultimate 中的 JavaScript 调试器可用于通过 Chrome DevTools 调试在 IDE 中运行的 JavaScript 代码。使用具有正确端口号的*附加到 Node.js/Chrome*配置。
<br>
此外,JCEF 提供了一个默认的 Chrome DevTools 前端(类似于 Chrome 浏览器中的前端),可以通过**Open DevTools**从 JCEF 的浏览器组件上下文菜单中**打开它**。该菜单项仅在[内部模式下](https://plugins.jetbrains.com/docs/intellij/enabling-internal.html)可用,从 2021.3 开始,平台注册表项`ide.browser.jcef.contextMenu.devTools.enabled`必须`true`显式设置为。
要在插件代码中访问 Chrome DevTools,请使用以下 API:
~~~
JBCefBrowser myBrowser = new JBCefBrowser(myUrl);
CefBrowser myDevTools = myBrowser.getCefBrowser().getDevTools();
JBCefBrowser myDevToolsBrowser = new JBCefBrowser(myDevTools, myBrowser.getJBCefClient());
~~~
已复制!
或者为了在单独的窗口中打开它:
~~~
JBCefBrowser myBrowser = new JBCefBrowser(myUrl);
myBrowser.openDevTools();
~~~
已复制!
## [应用程序接口](https://plugins.jetbrains.com/docs/intellij/jcef.html#api)
<br>
### [应用程序](https://plugins.jetbrains.com/docs/intellij/jcef.html#jbcefapp)
[`JBCefApp`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/ui/jcef/JBCefApp.java)
<br>
执行 JCEF 自动初始化、管理其生命周期并提供`JBCefClient`实例。
<br>
在使用 JCEF 之前,`JBCefApp.isSupported()`必须调用 check:
~~~
if (!JBCefApp.isSupported()) {
// Fallback to an alternative browser-less solution
return;
}
// Use JCEF
~~~
已复制!
<br>
在以下情况下可能不支持 JCEF:
* 它在 IDE 运行时中不可用(IDE 是使用替代 OpenJDK 启动的)。
* 它的版本与正在运行的 IDE 不兼容。
为避免上述问题,IDE 应与捆绑的 JBR 一起运行。
<br>
*****
### [客户端](https://plugins.jetbrains.com/docs/intellij/jcef.html#jbcefclient)
[`JBCefClient`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/ui/jcef/JBCefClient.java)
显式或隐式绑定到每个浏览器组件。用于向关联的浏览器添加处理程序。同一个实例可以在多个浏览器之间共享。取决于处理程序的逻辑,开发人员可以使用共享的或每个浏览器的实例。如果客户端被明确创建的,它应该是[处置](https://plugins.jetbrains.com/docs/intellij/disposers.html)由开发;否则,它会在关联的浏览器实例处理之后自动处理。
<br>
*****
### [浏览器](https://plugins.jetbrains.com/docs/intellij/jcef.html#jbcefbrowser)
[`JBCefBrowser`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/ui/jcef/JBCefBrowser.java)
提供浏览器UI组件:
~~~
JComponent getComponent();
~~~
已复制!
<br>
提供加载方法(也可从非 EDT 线程调用):
~~~
void loadURL(String);
void loadHTML(String);
~~~
已复制!
<br>
为了执行 JS 代码和回调(见下文),`CefBrowser`直接使用包装的实例:
~~~
getCefBrowser().executeJavaScript(String code, String url, int line);
~~~
已复制!
<br>
默认情况下,`JBCefBrowser`是使用隐式创建的`JBCefClient`(自动处理)。可以通过您自己的`JBCefClient`(由开发人员处理)。
<br>
访问:
~~~
JBCefClient getJBCefClient();
~~~
已复制!
将浏览器组件添加到 UI 的最简单方法:
~~~
JPanel myPanel = ...
myPanel.add(new JBCefBrowser("https://www.jetbrains.com").getComponent());
~~~
已复制!
<br>
*****
### [JBCefJS 查询](https://plugins.jetbrains.com/docs/intellij/jcef.html#jbcefjsquery)
[`JBCefJSQuery`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/platform/platform-api/src/com/intellij/ui/jcef/JBCefJSQuery.java)
<br>
提供JS查询回调机制。
<br>
无法从 Java 直接访问 JS DOM(如在 JavaFX WebView 中,另请参阅[此问题](https://youtrack.jetbrains.com/issue/JBR-2046))。尽管如此,JCEF 还是提供了一种与 JS 通信的异步方式。
<br>
通过一个例子来说明它更简单。假设我们想在外部浏览器中打开一个链接,并在[`MarkdownJCEFHtmlPanel.kt`](https://upsource.jetbrains.com/idea-ce/file/idea-ce-f3337ede11680b745f513943772150ee781a51c0/plugins/markdown/src/org/intellij/plugins/markdown/ui/preview/jcef/MarkdownJCEFHtmlPanel.kt):
~~~
// Create a JS query instance
final JBCefJSQuery myJSQueryOpenInBrowser =
JBCefJSQuery.create(myJBCefBrowser);
// Add a query handler
myJSQueryOpenInBrowser.addHandler((link) -> {
MarkdownAccessor.getSafeOpenerAccessor().openLink(link);
return null; // can respond back to JS with JBCefJSQuery.Response
});
// Inject the query callback into JS
myCefBrowser.executeJavaScript(
"window.JavaPanelBridge = {" +
"openInExternalBrowser : function(link) {" +
myJSQueryOpenInBrowser.inject("link") +
"}" +
"};",
getCefBrowser().getURL(), 0);
// Dispose the query when necessary
Disposer.dispose(myJSQueryOpenInBrowser);
~~~
- 空白目录
- 测试
- ReadMe
- Idea
- Introduction介绍
- Part01-Plugins插件
- 创建你第一个插件
- 用github模版
- 用Gradle
- Gradle入门
- 配置Gradle项目
- 使用Gradle发布插件
- 用DevKit
- 创建开发环境
- 创建一个插件项目
- 运行和debug一个插件
- 部署一个插件
- 发布一个插件
- IDE开发实例
- 将插件发布到自定义插件存储库
- 插件结构
- 插件内容
- 类加载器
- Actions
- 扩展
- 服务
- 监听器
- 扩展点
- Components
- 插件配置文件
- 插件Logo
- 依赖
- 动态插件
- IntelliJ平台工件库
- 插件开发者的 Kotlin
- 插件签名
- 内部Actions菜单
- 启用内部模式
- 内部操作 - UI 子菜单
- 内部操作 - UI 检查器
- 内部操作 - LaF 默认值
- 性能优化
- 插件开发常见问题
- Part02-基础平台
- 基础
- 处理器和一次性
- 一般线程规则
- 消息基础设施
- IDE基础设施
- 用户界面组件
- 工具窗口
- 对话框
- Popups
- 通知
- 文件和类选择器
- 编辑器组件
- 列表和树控件
- 其他Swing组件
- 使用图标和图像
- 配色方案管理
- Kotlin 用户界面 DSL
- JCEF - Java Chromium 嵌入式框架
- 自定义 UI 主题
- 创建自定义 UI 主题
- 自定义 UI 主题 - 图标和 UI 控件
- UI 主题 - 编辑器方案和背景图像
- 公开主题元数据
- Actions
- Actions教程
- 创建Actions
- Actions分组
- 持久化模型
- 组件的持久状态
- 持久化敏感数据
- 设置
- 设置指南
- 自定义设置组
- 设置教程
- 文件
- 虚拟文件系统
- 虚拟文件
- 文档
- 编辑
- 编辑器基础
- xxx
- 代码实现
- Temp-理解
- xxx