2014-11-03 3 views
0

Поскольку это мой первый пост, прощайте любые неточности. Моя проблема, я хочу, чтобы передать значение из яваскрипта функции JavaFX на методе инициализацииПередача значений в JavaFX из javascript

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); 
    } 
} 

}

и яваскрипт части, как это

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); 

Значение я хочу pass is lengthInMeters по методу calljavascript какие-то идеи? Thnx заранее

ответ

0

Я попытался упрощенную версию кода:

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() называется после был загружен в Интернете, поэтому initialize() называется перед методом 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>"); 

Обратите внимание, мы устанавливаем член перед тем загружается веб-контент.

EDIT

Я создал более подробный ответ here.

+0

yap Это было решение именно сейчас, все отлично работает, спасибо, человек :) – n00bfighter

+0

Это не работает при последующих вызовах нагрузки. невозможно установить элементы перед загрузкой. Есть ли лучшее решение? – mohamnag

+0

Пожалуйста, напишите новый вопрос, ссылаясь на это решение. –

Смежные вопросы