在JavaFX中使用JxBrowser invokeAndWaitFinishLoadingMainFrame()方法崩溃JVM

时间:2017-06-26 17:45:57

标签: javafx jxbrowser

我正在使用Mac OS Sierra上的JavaFX中的JXBrowser Chromium浏览器引擎进行试验。在调用browser.goBack()或browser.goForward()方法之后,我想等到URL完全加载,以便我可以检查导航历史记录。下面的简单应用程序崩溃了JVM,但相同的代码在Java(Swing)中运行良好。 Java swing应用程序中的相同调用没有任何问题。有谁知道为什么?

public class JavaFXSample extends Application {
@Override
public void init() throws Exception {
    // On Mac OS X Chromium engine must be initialized in non-UI thread.
    if (Environment.isMac()) {
        BrowserCore.initialize();
    }
}

@Override
public void start(final Stage primaryStage) {
    Browser browser = new Browser();
    BrowserView view = new BrowserView(browser);

    Scene scene = new Scene(new BorderPane(view), 700, 500);
    primaryStage.setScene(scene);
    primaryStage.show();

    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent t) {
            Platform.exit();
            System.exit(0);
        }
    });

    Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>
    () {
        @Override
        public void invoke(Browser browser) {
            browser.loadURL("http://www.google.com");
        }
    });
}

public static void main(String[] args) {
    launch(args);
}
}

1 个答案:

答案 0 :(得分:0)

看起来您遇到了死锁,因为您在重量级模式下创建了浏览器实例。您可以尝试使用“jxbrowser.ipc.external = true”VM参数来解决此问题,该参数启用轻量级呈现模式并在单独的本机进程中运行Chromium引擎以避免UI线程中的死锁。