我正在使用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);
}
}
答案 0 :(得分:0)
看起来您遇到了死锁,因为您在重量级模式下创建了浏览器实例。您可以尝试使用“jxbrowser.ipc.external = true”VM参数来解决此问题,该参数启用轻量级呈现模式并在单独的本机进程中运行Chromium引擎以避免UI线程中的死锁。