企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
>需要桥接,暂时用不上 JxBrowser支持Swing / AWT和JavaFX UI工具包。它提供了BrowserView类的两个实现,可用于将JxBrowser嵌入到Swing / AWT和JavaFX应用程序中: * com.teamdev.jxbrowser.chromium.swing.BrowserView * com.teamdev.jxbrowser.chromium.javafx.BrowserView 要将JxBrowser嵌入到SWT应用程序中,您可以使用下面描述的方法。这些方法基于第三方SWT-AWT和SWT-JavaFX组件(网桥)。 注意:请注意混合两个UI工具包并不是一项简单的任务,因此可能存在一些集成问题,如焦点转移,闪烁,冻结,线程死锁等。您可以阅读有关Swing / SWT中可能出现的问题的更多信息整合文章。 **对于macOS很重要**:如果您没有使用macOS通过Eclipse启动脚本, 则应使用 -XstartOnFirstThread参数运行Java 。否则,您将收到“org.eclipse.swt.SWTException:无效的线程访问”错误。如果您使用的是Eclipse,则会自动应用此参数,您不会遇到此错误。 从JxBrowser 6.0开始,我们开始在Java进程中初始化Chromium引擎以启用重量级渲染模式。Chromium引擎主动使用Cocoa UI线程以及Java Swing和SWT。在Cocoa UI线程(AppKit)中初始化Chromium非常重要。使用-XstartOnFirstThread VM标志,默认UI线程更改为Java“main”线程,这会破坏需要AppKit线程的Chromium功能。结果,Chromium无法在“主”线程中初始化,您看到了冻结问题,后来“IPC无法启动,因为Chromium没有响应”错误消息。 这是由6.0中的体系结构更改引起的回归问题。在实施SWT支持后应该完全解决。 同时,作为一种变通方法,您可以使用轻量级渲染模式和jxbrowser.ipc.external = true JVM参数。在这种情况下,Chromium引擎将在单独的本机进程中初始化,因此您将不再看到此问题。请注意,使用此JVM参数,您只能使用轻量级浏览器模式。 ### Swing&SWT 要将com.teamdev.jxbrowser.chromium.swing.BrowserView的 Swing / AWT实现嵌入到SWT应用程序中,请使用org.eclipse.swt.awt.SWT_AWT实例,如下所示: ``` import java.awt.Frame; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.swing.BrowserView; /** * The sample demonstrates how to use JxBrowser Swing control in * SWT application using SWT_AWT bridge. */ public class JxBrowserSwingSWT { public static void main(String[] arguments) { Browser browser = new Browser(); BrowserView view = new BrowserView(browser); Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Composite composite = new Composite(shell, SWT.EMBEDDED | SWT.NO_BACKGROUND); Frame frame = SWT_AWT.new_Frame(composite); frame.add(view); browser.loadURL("http://google.com"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } ``` ### JavaFX和SWT 要将com.teamdev.jxbrowser.chromium.javafx.BrowserView的 JavaFX实现嵌入到SWT应用程序中,请使用javafx.embed.swt.FXCanvas实例,如下所示 ``` import javafx.embed.swt.FXCanvas; import javafx.scene.Scene; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.javafx.BrowserView; /** * The sample demonstrates how to use JxBrowser JavaFX * control in SWT application using FXCanvas. */ public class JxBrowserJavaFXSWT { public static void main(String[] arguments) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Browser browser = new Browser(); FXCanvas canvas = new FXCanvas(shell, SWT.NONE); // BrowserView instance must be initialized after FXCanvas. BrowserView view = new BrowserView(browser); canvas.setScene(new Scene(view)); browser.loadURL("http://google.com"); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } } ```