Мы переносим наше приложение с jxbrowser v6.14 на v7.1. После замены всех API jxbrowser на новые API со ссылкой v6-v7 do c я не получаю ошибку компиляции. Тем не менее, он попадает в IllegalStateException. Поскольку это происходит довольно внутренне, я не могу разобраться, что пошло не так.
import com.teamdev.jxbrowser.browser.Browser;
import com.teamdev.jxbrowser.browser.callback.AlertCallback;
import com.teamdev.jxbrowser.browser.callback.InjectJsCallback;
import com.teamdev.jxbrowser.browser.event.ConsoleMessageReceived;
import com.teamdev.jxbrowser.engine.Engine;
import com.teamdev.jxbrowser.engine.EngineOptions;
import com.teamdev.jxbrowser.js.JsObject;
import com.teamdev.jxbrowser.view.javafx.BrowserView;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swt.FXCanvas;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.nio.file.Paths;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import static com.teamdev.jxbrowser.engine.RenderingMode.HARDWARE_ACCELERATED;
/**...*/
public final class HelloWorld extends Application {
private Browser browser;
private BrowserView view;
protected Control control;
private static Engine engine;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Platform.setImplicitExit(false);
browser = createBrowserObject();// creates the browser object
Display display = new Display();
Composite shell = new Shell(display);
shell.setSize(400, 400);
shell.setLayout(new FillLayout());
final FXCanvas canvas = new FXCanvas(shell, SWT.NONE);
view = BrowserView.newInstance(browser);
Scene scene = new Scene(new BorderPane(view), 700, 500);
canvas.setScene(scene);
browser.on(ConsoleMessageReceived.class, evt -> {
// Logger.log("Message: " + evt.consoleMessage().message());
});
browser.set(AlertCallback.class, (params, tell) -> {
// Logger.log("Alert dialog shown to the user. Info: " + params.message());
runOnUIThread(new Runnable() {
@Override
public void run() {
String title = "Information";
String message = params.message();
}
}, true);
// send OK signal to JxBrowser so that it can proceed further, else it will remain blocked
tell.ok();
});
// Inject bridge objects into JavaScript memory
browser.set(InjectJsCallback.class, params -> {
JsObject window = params.frame().executeJavaScript("window");
Object bridge = null;//getBridge();
if(bridge != null ){
window.putProperty("console", bridge);
window.putProperty("strategyBridge", bridge);
}
runOnUIThread(new Runnable() {
public void run() {
control.setData("initializing", "true");
if(true){
control.setFocus();
}
control.setData("initializing", "false");
}
}, false);
return InjectJsCallback.Response.proceed();
});
browser.navigation().loadUrl("http://abc.html");
}
/**
* Executes runnable on UIThread
* @param runnable
* @param async
*/
public static void runOnUIThread(final Runnable runnable, boolean async){
if(Thread.currentThread() == Display.getDefault().getThread()){
runnable.run();
}else{
if(async){
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
runnable.run();
}
});
}else{
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
runnable.run();
}
});
}
}
}
public static Browser createBrowserObject() {
String browserDir = "D:/temporary/"+ System.currentTimeMillis();
EngineOptions options = EngineOptions.newBuilder(HARDWARE_ACCELERATED)
.userDataDir(Paths.get(browserDir))
.remoteDebuggingPort(9223)//?
.licenseKey(getLicenceKey())
.build();
engine = Engine.newInstance(options);
return engine.newBrowser();
}
private static String getLicenceKey(){
return "ABCD..";
}
}
Добавлены зависимости maven:
<dependency>
<groupId>org.eclipse.swt</groupId>
<artifactId>org.eclipse.swt.win32.win32.x86_64</artifactId>
<version>4.3</version>
</dependency>
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser</artifactId>
<version>7.1</version>
</dependency>
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-javafx</artifactId>
<version>7.1</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.teamdev.jxbrowser</groupId>
<artifactId>jxbrowser-win64</artifactId>
<version>7.1</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>javafx</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/jfxswt.jar</systemPath>
</dependency>
Исключение обнаруживается, когда метод loadUrl здесь приведена полная трассировка исключений :
поток «Поток приложения JavaFX» java .lang.IllegalStateException в com.teamdev.jxbrowser.internal.util.Preconditions.checkState (Предварительные условия . java: 60) на com.teamdev.jxbrowser.internal.rp c .NewServiceConnection.invokeAsyn c (NewServiceConnection. java: 261) на com.teamdev.jxbrowser.browser.internal.WindowedWidget.detach (WindowedWidget. java: 60) в com.teamdev.jxbrowser.view.javafx.internal.HeavyweightWidget.detach (HeavyweightWidget. java: 205) в com.teamdev.jxbrowser.view.javafx.internal.HeavyweightWidget.hide (HeavyweightWidget. java: 193) на com.teamdev.jxbrowser.view.javafx.internal.HeavyweightWidget.close (HeavyweightWidget. java: 112) на com.teamdev.jxbrowser.view.javafx.internal.Platform.lambda $ Exec используйте $ 0 (Platform. java: 119) в com.sun.javafx.application.PlatformImpl.lambda $ null $ 173 (PlatformImpl. java: 295) в java .security.AccessController.doPrivileged (собственный метод). .