5

我无法让 Java / Javascript 桥在 Java11 和 Java13 上工作。这座桥似乎在 Java8 和 Java10 中运行良好。

这里的代码基本上与https://stackoverflow.com/a/34840552/11329518相同,它在 Java8 和 Java10 上也适用于我:

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

import javafx.application.Application;
import javafx.concurrent.Worker.State;
import javafx.scene.control.ButtonType;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebEvent;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class Main extends Application {

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

    JavaBridge bridge;
    WebEngine webEngine;

    @Override
    public void start(Stage primaryStage) throws MalformedURLException {

        final URL url = new File("C:/test.html").toURI().toURL();

        WebView webView = new javafx.scene.web.WebView();
        webEngine = webView.getEngine();
        webEngine.load(url.toExternalForm());
        webEngine.setJavaScriptEnabled(true);
        webEngine.setOnAlert(Main::showAlert);
        webEngine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
            if (newState == State.SUCCEEDED) {
                System.out.println("READY");
                JSObject jsobj = (JSObject) webEngine.executeScript("window");
                bridge = new JavaBridge();
                jsobj.setMember("bridge", bridge);
            }

        });
        primaryStage.setScene(new javafx.scene.Scene(webView, 300, 300));
        primaryStage.show();
    }

    // Shows the alert, used in JS catch statement
    private static void showAlert(WebEvent<String> event) {
        javafx.scene.control.Dialog<ButtonType> alert = new javafx.scene.control.Dialog<>();
        alert.getDialogPane().setContentText(event.getData());
        alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
        alert.showAndWait();
    }

    public class JavaBridge {
        public void hello() {
            System.out.println("hello");
        }
    }
}

包含test.htmlJavascript:

<button onclick="try{bridge.hello();}catch(err){alert(err.message);}">call java</button>

这是怎么回事?

单击按钮时出现以下错误:

bridge.hello is not a function. (In 'bridge.hello()', 'bridge.hello' is undefined)

4

1 回答 1

2

我无法使用 Java 11 (OpenJDK 11.0.2) 或 Java 13 (OpenJDK 13) 重现 JavaFX 13 或 14-ea+6 的问题。

但是,如果我删除对 Java 11 的强引用JavaBridge并使用 Java 11,我可以重现该问题。

这个:

jsobj.setMember("bridge", new JavaBridge());

使用 Java 11 失败,出现与您发布的相同错误。但是当使用 Java 13 (OpenJDK 13) 时,它工作正常(也适用于 Java 12)。

您是否在使用其他 Java 供应商?您可以尝试使用 OpenJDK https://jdk.java.net/13/吗?

于 2019-12-29T13:42:49.403 回答