嵌入谷歌地图在一个JavaFX 2.2的桌面应用程序引发异常和generaly不执行(embeddi

2019-06-28 06:47发布

我有需要的谷歌地图在桌面Java应用程序中嵌入一个项目。 我经过一番研究,发现的Java FX没有提供该功能,并着手编写一个示例应用程序的PoC。 应用工作,一切都很好。 升级到新7u7 Java版本后,我的代码不再工作就像它之前。 该代码运行并显示该网页,但没有手势(paning /变焦)事件被触发的网页(谷歌地图)和当我clikc某些原因和阻力(好像平移)我得到的封闭例外,我可以使无感。

我非常感激任何了解的人可能在谷歌地图中的一个JavaFX 2.2应用程序的emmbedding。 预先感谢您的任何帮助和/或建议

以下是我的应用程序代码/ 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);
                  }
                }
              });*/




  }

HTML加载到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>

在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)

Answer 1:

基于谢尔盖链接的问题,看来这个问题的一部分是由一个错误引起的谷歌地图API第3 ,是能够在浏览器的触摸事件(平移不与谷歌地图API第3版Chrome浏览器与触控工作的结果事件已启用)。

JavaFX的2.0.x版本(和的2.1.x)的WebView没有触摸事件实现,但JavaFX的2.2呢,因此人们有理由对两者之间的行为差​​异。

作为变通,你可以使用v2中的谷歌地图API的不拥有这个bug(也至少要等到API该版本在2013年5月19日下线)。 或者你可以使用的JavaFX 2.1,直到JavaFX的团队和谷歌执行修复/解决方法。 或者您也可以继续寻求其他解决方法,例如由谢尔盖或其它为你工作的变化建议。



Answer 2:

这看起来像在WebView中的错误,我会备案。

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

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

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


文章来源: embedding Google Maps in a JavaFX 2.2 desktop application throwing exception and generaly not performing