【问题标题】:passing values to JavaFX from javascript从 javascript 向 JavaFX 传递值
【发布时间】:2014-12-30 04:30:15
【问题描述】:

由于这是我的第一篇文章,请原谅任何不准确之处。我的问题,我想在初始化方法上将值从 javascript 函数传递给 Javafx

public void initialize(URL arg0, ResourceBundle arg1) {

    // TODO Auto-generated method stub
    final URL urlGoogleMaps = getClass().getResource("googlemaps.html");
    System.out.println("fjdsoij");
    browser.getEngine().load(urlGoogleMaps.toExternalForm());
    WebEngine webEngine = browser.getEngine(); 
    webEngine.getLoadWorker().stateProperty().addListener(
            new ChangeListener<State>(){

                @Override
                public void changed(ObservableValue<? extends State> ov, State oldState, State newState) {
                    if(newState == State.SUCCEEDED){
                        JSObject window = (JSObject)webEngine.executeScript("window");
                        window.setMember("app", new JavaApplication());

                    }
                }
            });
}

public class JavaApplication{
    public void calljavascript( int lengthInMeters){

        System.out.println(lengthInMeters);
    }
}   

}

而javascript部分是这样的

   function initialize() {
  var mapOptions = {
    zoom: 3,
    center: new google.maps.LatLng(0, -180),
    mapTypeId: google.maps.MapTypeId.TERRAIN
  };

  var map = new google.maps.Map(document.getElementById('map-canvas'),
      mapOptions);

  var flightPlanCoordinates = [
    new google.maps.LatLng(37.772323, -122.214897),
    new google.maps.LatLng(21.291982, 157.821856)

  ];
  var flightPath = new google.maps.Polyline({
    path: flightPlanCoordinates,
     //geodesic: true,
    strokeColor: '#FF0000',
    strokeOpacity: 1.0,
    strokeWeight: 2
  });
var lengthInMeters = google.maps.geometry.spherical.computeLength(flightPath.getPath());

  flightPath.setMap(map);
   alert("polyline is "+lengthInMeters+" long");
   app.calljavascript(lengthInMeters);
}

google.maps.event.addDomListener(window, 'load', initialize);

我要传递的值是方法 calljavascript 上的 lengthInMeters 有什么想法吗?提前谢谢

【问题讨论】:

    标签: java javascript google-maps-api-3 javafx google-polyline


    【解决方案1】:

    我尝试了您的代码的简化版本:

        WebEngine webEngine = browser.getEngine();
    
        webEngine.getLoadWorker().stateProperty().addListener((ov,oldState,newState)->{
            if(newState==State.SUCCEEDED){
                JSObject window = (JSObject) webEngine.executeScript("window");
                window.setMember("app", new JavaApplication());
            }
        });
        webView.getEngine().loadContent("<html>\n"
                + " <script>function initialize() {"
                + " var lengthInMeters = 5; " 
                + " app.calljavascript(lengthInMeters);"
                + "} </script> "
                + "    <body onLoad=\"initialize()\">Hi!\n"
                + "    </body>\n"
                + "</html>");
    

    它不工作。

    在你的情况和我的方法中,setMember() 被称为 web 已经加载,所以 initialize() 被称为 before load 方法.因此,app.calljavascript() 失败。

    解决办法是这样的:

        WebEngine webEngine = browser.getEngine();
        JSObject window = (JSObject) webEngine.executeScript("window");
        window.setMember("app", new JavaApplication());
    
        browser.getEngine().loadContent("<html>\n"
                + " <script>function initialize() {"
                + " var lengthInMeters = 5; " 
                + " app.calljavascript(lengthInMeters);"
                + "} </script> "
                + "    <body onLoad=\"initialize()\">Hi!\n"
                + "    </body>\n"
                + "</html>");
    

    请注意,我们在加载网页内容之前设置了成员。

    编辑

    我创建了一个更详细的答案here

    【讨论】:

    • yap 这就是解决方案,现在一切正常,谢谢你 :)
    • 这不适用于后续的加载调用。在加载之前无法设置成员。有没有更好的解决方案?
    • 请发布一个新问题,参考此解决方案
    • 重要提示:自 Java 8u101 以来,有一个 bugnew JavaApplication() 应该定义在一个私有字段中,以防止垃圾收集将其删除。一个局部变量一开始似乎可以工作,但会随机停止工作。
    • 我遇到了与@mohamnag 相同的问题,该桥适用于第一个页面加载,但不适用于后续页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 2018-12-29
    • 2016-06-04
    相关资源
    最近更新 更多