2012-09-12 8 views
7

Ich habe ein Projekt erfordert die Einbettung von Google Maps in einer Desktop-Java-Anwendung. Nach einigen Nachforschungen fand ich heraus, dass Java FX diese Funktionalität bietet und fuhr damit fort, eine Beispielanwendung als PoC zu schreiben. Die Anwendung hat funktioniert und alles war in Ordnung. Nach dem Upgrade auf die neue 7u7 Java-Version funktioniert mein Code nicht mehr wie zuvor. Der Code läuft und zeigt die Webseite, aber keine Geste (paning/zooming) Ereignisse werden auf die Webseite gefeuert (google maps) und aus irgendeinem Grund, wenn ich klikke und ziehe (wie um zu schwenken) bekomme ich die beigefügte Ausnahme welche Ich kann keinen Sinn machen.Einbetten von Google Maps in eine JavaFX 2.2-Desktop-Anwendung werfen Ausnahme und im Allgemeinen nicht

Ich würde sehr gerne jede Einsicht in die Embedding von Google Maps in einer JavaFX 2.2-Anwendung haben. Danke im Voraus für jede Hilfe und/oder Anregungen

Folgende ist mein Anwendungscode/HTML-Code und die Ausnahme ausgelöst:

JavaFX-Code:

private Scene scene; 
    private MyBrowser myBrowser; 
    private LocationClickHandler handler; 
    private Vector<Button> buttons; 
    //private Moderator moderator; 



    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     launch(args); 
    } 

    @Override 
     public void start(Stage primaryStage) { 

    buttons = new Vector<Button>(); 
    //moderator = new Moderator(); 
    handler=new LocationClickHandler(); 

    primaryStage.setTitle("java-buddy.blogspot.com"); 

    myBrowser = new MyBrowser(); 
    //moderator.registerAddIconListener(myBrowser); 
    VBox mainbox = new VBox(); 
    mainbox.getChildren().add(myBrowser); 



// mainbox.getChildren().add(generateEntitiesButtonBox()); 
// mainbox.getChildren().add(generateSensorsButtonBox()); 
    scene = new Scene(mainbox, 1280, 760); 

    primaryStage.setScene(scene); 

    primaryStage.show(); 

} 

    class MyBrowser extends Region { 

    HBox toolbar; 

    WebView webView = new WebView(); 
    WebEngine webEngine = webView.getEngine(); 


    public MyBrowser(){ 
     webView.setMinSize(1280, 400); 
     final URL urlGoogleMaps = getClass().getResource("googlemaps2.html"); 
     webEngine.load(urlGoogleMaps.toExternalForm()); 

     getChildren().add(webView); 
     /*webEngine.getLoadWorker().stateProperty().addListener(
       new ChangeListener<State>() { 
       @Override public void changed(ObservableValue<? extends State> ov, State oldState, State newState) { 
        if (newState == State.SUCCEEDED) { 
        JSObject win = (JSObject) webEngine.executeScript("window"); 
        win.setMember("java", handler); 
        } 
       } 
       });*/ 




    } 

HTML-Code in die Web View geladen:

<!DOCTYPE html> 
    <html> 
    <head> 
    <title>Java-Buddy: Google Maps</title> 
    <script src="http://maps.google.com/maps/api/js?sensor=false"></script> 
    <style>#mapcanvas { height: 500px; width: 100%}</style> 

    <script type="text/javascript"> 
    var map; 
    var icon="icons/Tank.png"; 
    var last_clicked; 
    var elliptical=0; 

    var sensors = new Array(); 
    var sensors_to_targets = new Array(); 
    var targets = new Array(); 
    var target_paths = new Array(); 
    var target_polys = new Array(); 

    var counter =0; 
    //var marker; 

    function loadmap(){ 

     var options = { 
      zoom: 16, 
      center: new google.maps.LatLng(51.507222, -0.1275), 
      mapTypeId: google.maps.MapTypeId.SATELLITE, 
      streetViewControl: false 
     } 
     map = new google.maps.Map(document.getElementById("mapcanvas"), options); 
     google.maps.event.trigger(map,'resize'); 
     google.maps.event.addListener(map, 'click', function(event) { 

     java.saveLocation(event.latLng.lat(),event.latLng.lng()); 


     }); 



     } 





    </script> 

    </head> 
    <body onload="loadmap()"> 
    <div id="mapcanvas"></div> 
    </body> 
    </html> 

Ausnahme ausgelöst, wenn in der Web-Ansicht ziehen:

java.lang.NullPointerException: Clipboard.putContent: null data 
at com.sun.javafx.tk.quantum.QuantumClipboard.putContent(QuantumClipboard.java:442) 
at javafx.scene.input.Clipboard.setContent(Clipboard.java:226) 
at com.sun.webpane.sg.UIClientImpl.confirmStartDrag(UIClientImpl.java:178) 
at com.sun.webpane.platform.WebPage.confirmStartDrag(WebPage.java:861) 
at javafx.scene.web.WebView$19.handle(WebView.java:1204) 
at javafx.scene.web.WebView$19.handle(WebView.java:1201) 
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:69) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:217) 
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:170) 
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:38) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:37) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:35) 
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:92) 
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:53) 
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:33) 
at javafx.event.Event.fireEvent(Event.java:171) 
at javafx.scene.Scene$DnDGesture.fireEvent(Scene.java:2627) 
at javafx.scene.Scene$DnDGesture.process(Scene.java:2706) 
at javafx.scene.Scene$DnDGesture.access$8700(Scene.java:2603) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3340) 
at javafx.scene.Scene$MouseHandler.process(Scene.java:3164) 
at javafx.scene.Scene$MouseHandler.access$1900(Scene.java:3119) 
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1559) 
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2261) 
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:228) 
at com.sun.glass.ui.View.handleMouseEvent(View.java:528) 
at com.sun.glass.ui.View.notifyMouse(View.java:922) 
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29) 
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73) 
at java.lang.Thread.run(Unknown Source) 

Antwort

4

Basierend auf der Ausgabe Sergey verbunden sind, es scheint ein Teil dieser Ausgabe durch einen Fehler in Google Maps v3 api verursacht wird, und ist ein Ergebnis Aktivieren von Berührungsereignissen im Browser (das Panning funktioniert nicht mit Google Maps v3 API in Chrome, wenn Touch-Ereignisse ebenfalls aktiviert sind).

JavaFX 2.0.x (und 2.1.x) Webview hatte keine Touch-Ereignisse implementiert, aber JavaFX 2.2, daher ein Grund für den Unterschied im Verhalten zwischen den beiden.

Als eine Arbeit könnten Sie verwenden v2 of the google maps api, die diesen Fehler nicht enthalten (zumindest bis diese Version der API am 19. Mai 2013 offline geht). Oder Sie können JavaFX 2.1 verwenden, bis das JavaFX-Team und Google einen Fix/Workaround implementieren. Oder Sie können weiter nach anderen Problemumgehungen suchen, wie sie von Sergey vorgeschlagen wurden, oder nach Varianten, die für Sie arbeiten.

+0

ist die beste Sache, um zu JavaFX 2.1 zurückzukehren. Wie ich bereits erwähnt habe, habe ich versucht, zurück zu 2.0.3 (das ist die neueste alte Version Oracle bietet auf ihrer Website) und die Schnittstelle mit Google Maps funktionierte gut, aber die JavaScript zu JavaFX Brücke ist nicht auf dieser Version implementiert, und ich brauche das Feature auch. Die einzige Version, die mit Google Maps funktioniert und eine JavaScript-JavaFX-Bridge implementiert, ist 2.1, und ich kann nirgendwo finden, wo ich sie herunterladen kann. Ich brauche die Version 2.1 32.Wenn Sie irgendwo wissen, wo ich es herunterladen kann, wäre es sehr zu schätzen. – user1666216

+0

Entschuldigung die JavaFX 2.1 Laufzeit und SDK ist derzeit [nicht wo es sein soll] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html), Ich weiß nicht, wo ich sie finden kann. – jewelsea

+0

Oracle hat jetzt die [JavaFX 2.1 Laufzeit und SDK] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html) dort platziert, wo sie sein sollen . – jewelsea

2

Das sieht wie ein Fehler in WebView aus, ich werde es ablegen.

Als Abhilfe können Sie einen leeren Drag-Handler Ihre WebView zur Verfügung stellen kann:

 webView.setOnDragDetected(new EventHandler<MouseEvent>() { 

      @Override 
      public void handle(MouseEvent t) { 
       // intentionally do nothing 
      } 
     }); 
+1

upd: Es gibt bereits ein Problem http://javafx-jira.kenai.com/browse/RT-22914 –

+0

Ja, das könnte ich tun. Aber ich brauche die Funktionalität der zugrunde liegenden Google Maps. Ich muss das Ziehereignis an die Webseite weiterleiten, um das Panning zu ermöglichen. Ich denke, thinki erwähnt es, aber keine Ereignisse scheinen auf die Webseite weitergeleitet zu werden (kein Klick, außer auf den Tasten. Kein Mouce Scroll und kein ziehen). – user1666216

+0

UPDATE: Ich kehrte zu JavaFX 2.0.3 zurück und referenzierte die jfxrt.jar von dort. scheint alles funktioniert gut für diese Version. Panning und Scrolling erhalten und keine Ausnahmen ausgelöst. – user1666216

Verwandte Themen