💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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); ~~~