Gui*_* F. 5 javascript java javafx java-11 java-13
我无法让 Java/Javascript 桥在 Java11 和 Java13 上工作。该桥接器似乎在 Java8 和 Java10 中运行良好。
这里的代码与/sf/answers/2438838671/基本相同,它在 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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
与test.html包含JavaScript:
<button onclick="try{bridge.hello();}catch(err){alert(err.message);}">call java</button>
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
单击按钮时出现以下错误:
bridge.hello is not a function. (In 'bridge.hello()', 'bridge.hello' is undefined)
我无法使用 Java 11 (OpenJDK 11.0.2) 或 Java 13 (OpenJDK 13) 重现 JavaFX 13 或 14-ea+6 的问题。
但是,如果我删除对的强引用JavaBridge并使用 Java 11,我可以重现该问题。
这:
jsobj.setMember("bridge", new JavaBridge());
Run Code Online (Sandbox Code Playgroud)
使用 Java 11 时会失败,并出现与您发布的相同错误。但是当使用 Java 13 (OpenJDK 13) 时,效果很好(对于 Java 12 也是如此)。
您是否使用其他 Java 供应商?您可以尝试使用 OpenJDK https://jdk.java.net/13/吗?
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |