【问题标题】:Upcall Javascript to JavaFX将 Javascript 调用到 JavaFX
【发布时间】:2013-06-04 20:19:31
【问题描述】:

我想了解更多关于 JavaFX 的信息,所以我尝试设置 Webview。 我从 Oracle 网站复制了 webview 示例并添加了 Upcall 功能。 但它不起作用。实际上我不知道如何在 Webview 中调试网站。 所以这里是java代码:

package boersensim;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;


public class Main extends Application {
private Scene scene;
@Override public void start(Stage stage) {
    // create the scene
    stage.setTitle("Web View");
    scene = new Scene(new Browser(),750,500, Color.web("#666970"));
    stage.setScene(scene);
    //scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
    stage.show();
}

public static void main(String[] args){
    launch(args);
}
}
class Browser extends Region {

final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();

public Browser() {
    //apply the styles
    getStyleClass().add("browser");
    // load the web page
    webEngine.load("test.html");
    //add the web view to the scene
    getChildren().add(browser);

    JSObject jsobj = (JSObject) webEngine.executeScript("window");
    jsobj.setMember("java", new Bridge());
}
private Node createSpacer() {
    Region spacer = new Region();
    HBox.setHgrow(spacer, Priority.ALWAYS);
    return spacer;
}

@Override protected void layoutChildren() {
    double w = getWidth();
    double h = getHeight();
    layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
}

@Override protected double computePrefWidth(double height) {
    return 750;
}

@Override protected double computePrefHeight(double width) {
    return 500;
}
}

class Bridge {
public void exit() {
    //Platform.exit();
    System.out.print("Hello!UPCALL");
}
}

对应的HTML是:

Click<a href="#" onclick="java.exit();">here</a>to exit the application

当我点击链接时,什么也没有发生。

提前感谢您, 丹尼尔

【问题讨论】:

    标签: javascript webview javafx


    【解决方案1】:

    在页面加载事件上设置 Bridge()

    webEngine.setJavaScriptEnabled(true);
    webEngine.getLoadWorker().stateProperty().addListener(
                new ChangeListener<Worker.State>() {
                    public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
                        if (newState == Worker.State.SUCCEEDED) {                        
                            JSObject jso = (JSObject) webEngine.executeScript("window");
                            jso.setMember("java", new Bridge());
                        }
    
                    }
                });
    

    【讨论】:

      【解决方案2】:

      我也跟着这个教程(可能是你用的那个): https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx

      并发现它使JVM崩溃。于是我在JavaFX jira上报了一个问题,得到了如下回复:

      从 7u5 开始,要求从 JS 调用的方法在 Java 意义上是可访问的,即 >公共类的公共成员。 (这在文章的最后一条评论中提到)。在这个>特定的测试用例中,Bridge 应该被声明为一个公共类。

      崩溃已在 JDK8 中得到修复。现在抛出异常。

      这行得通。

      【讨论】:

      • 要是我在 3 小时前才看到这个回复就好了!我有一个静态内部类没有 public 修饰符,JVM 崩溃。在课堂上添加了public,现在它可以工作了。谢谢!
      【解决方案3】:

      代码中需要更改的三件事 Daniel,
      1) 让您的班级桥梁公开
      2) 像这样启用 JavaScript webEngine.setJavaScriptEnabled(true);
      3) 在页面加载事件上设置 Member Bridge(),如下所示

      webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
      
              @Override
              public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue) {
                  // TODO Auto-generated method stub
                   if (newValue == Worker.State.SUCCEEDED) {                        
                       JSObject jso = (JSObject) webEngine.executeScript("window");
                       jso.setMember("java", new Bridge());
                   }
      
              }
          });
      

      欢迎,丹尼尔

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-17
        • 2023-04-08
        • 1970-01-01
        • 2013-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多