将Google地图嵌入JavaFX 2.2桌面应用程序中,导致exception并且通常无法执行

我有一个项目需要在桌面java应用程序中嵌入谷歌地图。 经过一些研究,我发现Java FX确实提供了这种function,并开始将示例应用程序编写为PoC。 应用程序工作,一切都很好。 升级到新的7u7 java版本后,我的代码不再像以前那样工作了。 代码运行并显示网页,但没有手势(平移/缩放)事件被触发到网页(谷歌地图)和由于某种原因,当我clikc和拖动(好像要平移)我得到随附的exception,我没有意义。

我非常感谢有人在JavaFX 2.2应用程序中嵌入Google地图时可能有的任何见解。 提前感谢您提供任何帮助和/或建议

以下是我的应用程序代码/ HTML代码和抛出的exception:

JavaFX代码:

private Scene scene; private MyBrowser myBrowser; private LocationClickHandler handler; private Vector

HTML加载到Web视图中:

     Java-Buddy: Google Maps  #mapcanvas { height: 500px; width: 100%}  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()); }); }    

在Web视图中拖动时抛出的exception:

 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) 

根据谢尔盖链接的问题,似乎这个问题的一部分是由于Google Maps v3 api中的错误引起的,并且是在浏览器中启用触摸事件的结果(平移无法与Chrome中的Google Maps v3 api一起使用触摸事件已启用)。

JavaFX 2.0.x(和2.1.x)webview没有实现触摸事件,但JavaFX 2.2确实如此,因此两者之间行为不同的原因之一。

作为一个解决方案,您可以使用谷歌地图api的v2,这不会出现此错误(至少在该版本的api于2013年5月19日离线之前)。 或者您可以使用JavaFX 2.1,直到JavaFX团队和Google实施修复/解决方法。 或者您可以继续寻求其他解决方法,例如谢尔盖建议的或其中适合您的变体。

这看起来像WebView中的一个错误,我会将其归档。

作为一种解决方法,您可以为WebView提供一个空的拖动处理程序:

  webView.setOnDragDetected(new EventHandler() { @Override public void handle(MouseEvent t) { // intentionally do nothing } });