Исключение в jxBrowser при миграции с v6 на v.7 с помощью javaFx - PullRequest
0 голосов
/ 22 апреля 2020

Мы переносим наше приложение с 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 (собственный метод). .

1 Ответ

0 голосов
/ 30 апреля 2020

К сожалению, обе комбинации JavaFX / SWT и Swing / SWT не поддерживаются JxBrowser 7. Это может быть причиной, по которой вы получаете эти ошибки.

Встроенная поддержка SWT находится в стадии разработки, но еще не выпущена.

...