java - 将 Google Maps 嵌入 JavaFX 2.2 桌面应用程序抛出异常并且通常不执行

标签 java google-maps webview javafx-2

我有一个项目需要在桌面 Java 应用程序中嵌入谷歌地图。经过一些研究,我发现 Java FX 确实提供了这个功能,并着手编写一个示例应用程序作为 PoC。该应用程序工作正常,一切都很好。 升级到新的 7u7 java 版本后,我的代码不再像以前那样工作了。 代码运行并显示网页,但没有手势(平移/缩放)事件被触发到网页(谷歌地图)并且由于某种原因当我点击并拖动(好像平移)时我得到了封闭的异常我无法理解。

我非常感谢任何人可能对将 Google map 嵌入 JavaFX 2.2 应用程序有任何见解。 预先感谢您的任何帮助和/或建议

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

JavaFX 代码:

    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);
                  }
                }
              });*/




  }

加载到 Web View 中的 HTML:

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

在网页 View 中拖动时抛出异常:

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)

最佳答案

根据 Sergey 链接的问题,这个问题的一部分似乎是由 Google Maps v3 api 中的错误引起的并且是在浏览器中启用触摸事件的结果(平移不适用于 Chrome 中启用了触摸事件的 Google Maps v3 api)。

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

作为解决方法,您可以使用 v2 of the google maps api它没有这个错误(至少在该版本的 api 于 2013 年 5 月 19 日下线之前是这样)。或者您可以使用 JavaFX 2.1,直到 JavaFX 团队和 Google 实现修复/解决方法。或者您可以继续寻找其他解决方法,例如 Sergey 建议的解决方法或适合您的变体。

关于java - 将 Google Maps 嵌入 JavaFX 2.2 桌面应用程序抛出异常并且通常不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391508/

相关文章:

Java - 当我尝试打印时线程池同步问题

Java递归函数判断两个连续数字是否相等

java - 为什么在 JVM 中运行的每个线程中一次只能激活一个方法?

Android map 显示从其他 Activity 中选择的点

google-maps - 用于地理编码的 map API key 不起作用

google-maps - 如何阻止谷歌地图转移到中心

android - 如何覆盖 webview 的文本选择上下文菜单?

java - Android Studio - 任务 ':app:transformClassesWithDexForDebug' 执行失败 - java.exe 以非零退出值 2 完成

android – 如何检查webview是否可用?

javascript - 未捕获的 ReferenceError,通过 android 应用程序调用 javascript 函数..?