2017-11-01 5 views
0

私はjxBrowserでJava Swingのマップを開発しています。問題は、Java Swing(executeJavaScriptAndReturnValue)からjava Swingにlat/long変数を戻す必要があることです。jxBrowserとGoogleのJavaスイングスイング

browser.executeJavaScriptAndReturnValue(
       "map.addListener('click', function(e) {\n" + 
       "placeMarker(e.latLng, map);\n" + 
       "});\n" + 
       "\n" + 
       "function placeMarker(position, map) {\n" + 
       "  var marker = new google.maps.Marker({\n" + 
       "  position: position,\n" + 
       "  map: map,\n" + 
       "  title:'test point',\n " + 
       " });\n" + 
       " map.panTo(position);\n" + 
       "}"); 

答えて

1

投稿したコードによれば、executeJavaScriptAndReturnValue()は、マップイベントにリスナーを設定します。この場合、マップ側のイベントが受信されるとすぐにJava側にコールバックしてlatLngの値を渡す必要があります。ここで

はアプローチを実証する完全なサンプルです:

public class GoogleMapsSample { 

    public static void main(String[] args) { 
     final Browser browser = new Browser(); 
     browser.addScriptContextListener(new ScriptContextAdapter() { 
      @Override 
      public void onScriptContextCreated(ScriptContextEvent event) { 
       browser.executeJavaScriptAndReturnValue("window").asObject().setProperty("java", new JavaCallback()); 
      } 
     }); 
     BrowserView view = new BrowserView(browser); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(view, BorderLayout.CENTER); 
     frame.setSize(900, 500); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

     // Provide the correct full path to the map.html file, e.g. D:\\map.html 
     Browser.invokeAndWaitFinishLoadingMainFrame(browser, new Callback<Browser>() { 
      @Override 
      public void invoke(Browser value) { 
       browser.loadURL("map.html"); 
      } 
     }); 
     browser.executeJavaScriptAndReturnValue(
       "map.addListener('click', function(e) {\n" + 
         "placeMarker(e.latLng, map);\n" + 
         "});\n" + 
         "\n" + 
         "function placeMarker(position, map) {\n" + 
         "  var marker = new google.maps.Marker({\n" + 
         "  position: position,\n" + 
         "  map: map,\n" + 
         "  title:'test point',\n " + 
         " });\n" + 
         " map.panTo(position);\n" + 
         " window.java.onMarkerAdded(position);" + 
         "}"); 
    } 

    public static class JavaCallback { 
     public void onMarkerAdded(JSObject position){ 
      double lat = position.getProperty("lat").asFunction().invoke(position).asNumber().getDouble(); 
      double lng = position.getProperty("lng").asFunction().invoke(position).asNumber().getDouble(); 
      System.out.println("lat = " + lat + ", lng = " + lng); 
     } 
    } 
} 

このサンプルで使用することができますmap.htmlのHTMLコード:はGoogleでAPI_KEYを置き換え、このファイルを使用するには

The code of our map.html file is the following: 
HTML 

<!DOCTYPE html> 
<html> 
<head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
    <style type="text/css"> 
     html { height: 100% } 
     body { height: 100%; margin: 0; padding: 0 } 
     #map-canvas { height: 100% } 
    </style> 
    <script type="text/javascript" 
      src="https://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=false"></script> 
    <script type="text/javascript"> 
    var map; 
    function initialize() { 
     var mapOptions = { 
     center: new google.maps.LatLng(48.209331, 16.381302), 
     zoom: 4 
     }; 
     map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); 
    } 
    google.maps.event.addDomListener(window, 'load', initialize); 

    </script> 
</head> 
<body> 
<div id="map-canvas"></div> 
</body> 
</html> 

APIキー。 APIキーを取得する方法については、instructionをご覧ください。

あなたは次の資料にJavaScriptからJavaへのコールバックの一般的な説明を見つけることができます。 https://jxbrowser.support.teamdev.com/support/solutions/articles/9000013062-calling-java-from-javascript

関連する問題