2013-11-19 2 views
2

Я реализую приложение в java swing java fx с API карт Google.Событие onload для Java FX

Моя проблема в этом, мне нужно, когда карта загружена, запускает javascript.

Я читаю метод: webEngine.getLoadWorker().StateProperty().AddListener , но не работает в моем коде. Интересно, знает ли кто-нибудь, как это сделать.

Я оставляю мой код: SwingHtmlDemo.Java:

public class SwingHtmlDemo { 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ApplicationFrame mainFrame = new ApplicationFrame(); 
       mainFrame.setVisible(true); 

      } 
     }); 

    } 

} 

/* Главное окно используется для отображения некоторого содержимого HTML. */

class ApplicationFrame extends JFrame { 

    JFXPanel javafxPanel; 
    WebView webComponent; 
    JPanel mainPanel; 

    JTextField urlField; 
    JButton goButton; 

    public ApplicationFrame() { 

     javafxPanel = new JFXPanel(); 

     initSwingComponents(); 

     loadJavaFXScene(); 

    } 

    /** 
    * Instantiate the Swing compoents to be used 
    */ 
    private void initSwingComponents() { 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 
     mainPanel.add(javafxPanel, BorderLayout.CENTER); 

     JPanel urlPanel = new JPanel(new FlowLayout()); 
     urlField = new JTextField(); 
     urlField.setColumns(50); 
     urlPanel.add(urlField); 
     goButton = new JButton("Go"); 
     urlField.setText("Rio branco 1421 montevideo"); 
     /** 
     * Handling the loading of new URL, when the user enters the URL and 
     * clicks on Go button. 
     */ 

     goButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         String url = urlField.getText(); 
         if (url != null && url.length() > 0) { 
          webComponent.getEngine().executeScript("document.goToLocation(\"" + urlField.getText() + "\")"); 
         } 
        } 
       }); 

      } 
     }); 

     urlPanel.add(goButton); 
     mainPanel.add(urlPanel, BorderLayout.NORTH); 

     this.add(mainPanel); 
     this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
     this.setSize(700, 600); 

    } 

    /** 
    * Instantiate the JavaFX Components in the JavaFX Application Thread. 
    */ 
    private void loadJavaFXScene() { 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 

       BorderPane borderPane = new BorderPane(); 
       webComponent = new WebView(); 

       webComponent.getEngine().load(getClass().getResource("googlemap.html").toString()); 
       borderPane.setCenter(webComponent); 
       Scene scene = new Scene(borderPane, 450, 450); 
       javafxPanel.setScene(scene); 

      } 
     }); 

    } 

} 

googlemap.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: 0px; padding: 0px } 
    #map_canvas { height: 100%; background-color: #666970; } 
</style> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?key=AIzaSyDRtQjq-q-w0Yr6BZ6y1nRGzAUM93udakg&sensor=false"> 
</script> 
<script type="text/javascript"> 
    function initialize() { 
    var latlng = new google.maps.LatLng(37.39822, -121.9643936); 
    var myOptions = { 
     zoom: 14, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     mapTypeControl: false, 
     navigationControl: false, 
     streetViewControl: false, 
     backgroundColor: "#666970" 
    }; 

    document.geocoder = new google.maps.Geocoder(); 
    document.map = new google.maps.Map(document.getElementById("map_canvas"),myOptions); 

    document.zoomIn = function zoomIn() { 
     var zoomLevel = document.map.getZoom(); 
     if (zoomLevel <= 20) document.map.setZoom(zoomLevel + 1); 
    } 

    document.zoomOut = function zoomOut() { 
     var zoomLevel = document.map.getZoom(); 
     if (zoomLevel > 0) document.map.setZoom(zoomLevel - 1); 
    } 

    document.setMapTypeRoad = function setMapTypeRoad() { 
     document.map.setMapTypeId(google.maps.MapTypeId.ROADMAP); 
    } 
    document.setMapTypeSatellite = function setMapTypeSatellite() { 
     document.map.setMapTypeId(google.maps.MapTypeId.SATELLITE); 
    } 
    document.setMapTypeHybrid = function setMapTypeHybrid() { 
     document.map.setMapTypeId(google.maps.MapTypeId.HYBRID); 
    } 
    document.setMapTypeTerrain = function setMapTypeTerrain() { 
     document.map.setMapTypeId(google.maps.MapTypeId.TERRAIN); 
    } 

    document.goToLocation = function goToLocation(searchString) { 
     var address = searchString; 
    document.geocoder.geocode({ 'address': address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     document.map.setCenter(results[0].geometry.location); 
     var marker = new google.maps.Marker({ 
      map: document.map, 
      position: results[0].geometry.location 
     }); 
     if (results[0].geometry.viewport) 
      document.map.fitBounds(results[0].geometry.viewport); 
     } else { 
     alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
    } 
    } 

</script> 
</head> 
<body onload="initialize()"> 
    <div id="map_canvas" style="width:100%; height:100%"></div> 
</body> 
</html> 
+0

в основном мне нужно выполнить document.goToLocation (\ "" + urlField.getText() + "\") перед нагрузкой карты. –

+0

@ Kleopatra какой тег javascript? –

+0

@ Kleopatra, потому что мне нужно выполнить javascript-код из приложения javaFx, неправильно этот тег? –

ответ

3

Попробуйте добавить FirebugLite для отладки приложения:

<script src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> 

Если я правильно понял вопрос, вам нужно запустить этот внутри «прослушиваемый документ» прослушиватель событий:

webComponent.getEngine().load(getClass().getResource("googlemap.html").toString()); 

webComponent.getEngine().stateProperty().addListener(new ChangeListener<Worker.State>() { 
    @Override 
    public void changed(ObservableValue<? extends Worker.State> ov, Worker.State t, Worker.State t1) { 
     if (t1 == Worker.State.SUCCEEDED) { 
      // this will be run as soon as WebView is initialized. 
      webComponent.getEngine().executeScript("document.goToLocation(\"" + urlField.getText() + "\")");    
     } 
    } 
}); 

UPDATE

Сообщение означает, что нет такой функции, поэтому вам нужно скопировать JS из исходного HTML-файла в googlemap.html:

document.goToLocation = function goToLocation(searchString) { 
    document.geocoder.geocode({'address': searchString}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
     document.map.setCenter(results[0].geometry.location); 
     } else { 
     alert("Geocode was not successful for the following reason: " + status); 
     } 
    }); 
} 

UPDATE 2

Работал после этого (необходимо сделать это для всех функций):


document.goToLocation = function 
             
  
    goToLocation 
  (searchString) { 

Вы могли бы рассмотреть возможность добавления FirebugLite отладки JS приложения:

<script src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> 
+0

спасибо за ваш быстрый ответ, я уже пробовал это и получаю исключение: netscape.javascript.JSException: TypeError: 'undefined' не является функцией \t на com.sun.webpane.platform.WebPage.twkExecuteScript (нативный метод) \t в com.sun.webpane.platform.WebPage.executeScript (WebPage.java:1438) \t в javafx.scene.web.WebEngine. executeScript (WebEngine.java:811) –

+0

есть функция js, позволяющая мне обновить код и поместить googlemap.htm. –

+0

код обновлен, так как вы выполняете функцию. спасибо –

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