2012-09-12 12 views
7

Tengo un proyecto que requiere la incrustación de google maps en una aplicación Java de escritorio. Después de algunas investigaciones descubrí que Java FX proporciona esta funcionalidad y procedí a escribir una aplicación de muestra como PoC. la aplicación funcionó y todo estaba bien. Después de actualizar a la nueva versión de 7u7 java, mi código ya no funciona como antes. El código se ejecuta y muestra la página web, pero no se activan eventos gestuales (paning/zooming) en la página web (google maps) y, por alguna razón, cuando hago clikc y arrastro (como para desplazarme) obtengo la excepción adjunta que no puedo tener ningún sentido de.incrustación de Google Maps en una aplicación de escritorio JavaFX 2.2 lanzando una excepción y generalmente no realizando

Agradecería cualquier idea que alguien pueda tener en el emmbedding de Google Maps en una aplicación JavaFX 2.2. Gracias de antemano por cualquier ayuda y/o sugerencias

Siguiendo es mi código de las aplicaciones de código/HTML y la excepción lanzada:

JavaFX código:

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 cargado en la Web:

<!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> 

excepción arrojada al arrastrar en la vista web:

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) 

Respuesta

4

Basado en el tema Sergey vinculado, parece una parte de este problema se debe a un error en Google Maps v3 api y es el resultado de habilitar eventos táctiles en el navegador (la panorámica no funciona con Google Maps v3 api en Chrome con eventos táctiles habilitados).

JavaFX 2.0.x (y 2.1.x) webview no tiene eventos táctiles implementados, pero JavaFX 2.2 sí lo hace, de ahí una razón para la diferencia de comportamiento entre los dos.

Como solución alternativa puede usar v2 of the google maps api que no presentan este error (bueno al menos hasta que la versión de la API se desconecte el 19 de mayo de 2013). O puede usar JavaFX 2.1 hasta que el equipo de JavaFX y Google implementen una solución/solución. O puede continuar buscando otras soluciones como la sugerida por Sergey o una variación de la misma que le resulte útil.

+0

lo mejor que se puede hacer es volver a JavaFX 2.1. Como indiqué anteriormente, traté de volver a la versión 2.0.3 (que es la última versión que Oracle ofrece en su sitio) y la interfaz con Google Maps funcionó bien, pero el puente JavaScript a JavaFX no está implementado en esa versión y lo necesito función también. la única versión que funcionará con Google Maps e implementa un puente JavaScript-JavaFX es 2.1, y no puedo encontrar desde donde descargarla. Necesito la versión 2.1 32.Si sabes de algún lugar donde puedo descargarlo, sería muy apreciado. – user1666216

+0

Lo sentimos, el JavaFX 2.1 runtime y sdk se encuentran actualmente [no donde se supone que debe estar] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html), así que no sé dónde encontrarlos. – jewelsea

+0

Oracle ha colocado el [JavaFX 2.1 runtime y sdk] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html) donde se supone que deben estar . – jewelsea

2

Esto parece un error en WebView, lo archivaré.

Como solución puede proporcionar un manejador de arrastrar vacío a su WebView:

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

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

upd: ya existe un problema http://javafx-jira.kenai.com/browse/RT-22914 –

+0

Sí, podría hacer eso. Pero necesito la funcionalidad de los mapas de google subyacentes. Necesito que el evento de arrastre sea retransmitido a la página web para habilitar el paning. No creo que lo haya mencionado, pero parece que ningún evento se retransmite a la página web (sin hacer clic, excepto en los botones. No hay desplazamiento de pantalla ni arrastre). – user1666216

+0

ACTUALIZACIÓN: Volví a JavaFX 2.0.3 y hice referencia a jfxrt.jar desde allí. parece que todo está funcionando bien en esa versión. obtener panorámica y desplazamiento y sin excepciones. – user1666216

Cuestiones relacionadas