2014-11-03 3 views
0

이것은 내 첫 번째 게시물이므로 부정확 한 점을 용서하십시오. 내 문제 나 초기화 방법자바 스크립트에서 값을 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); 
    } 
} 

}

및 자바 스크립트 부분 자바 FX에 자바 스크립트 함수로부터 값을 전달할이

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

같은 내가 원하는 값 패스는 lengthInMeters 메서드에 calljavascript 어떤 아이디어입니까? 나는 코드의 단순화 된 버전을 시도했습니다 사전

답변

0

에 thnx :

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

공지 사항 우리가 회원에게 웹 콘텐츠가로드 전에 을 설정합니다. 내가 더 정교 대답 here을 만들었습니다

편집 할 수 있습니다.

+0

yap 그것은 해결책이었습니다. 이제는 모든 것이 잘 작동합니다. :) – n00bfighter

+0

결과로드 호출에서 작동하지 않습니다. 더 이상로드하기 전에 멤버를 설정할 수 없습니다. 더 나은 해결책이 있습니까? – mohamnag

+0

이 솔루션을 추천하는 새로운 질문을 올리십시오. –

관련 문제