2012-09-12 21 views
7

Tôi có một dự án yêu cầu nhúng bản đồ google vào một ứng dụng java trên máy tính để bàn. Tôi tìm thấy sau khi một số nghiên cứu mà Java FX cung cấp chức năng này và tiến hành viết một ứng dụng mẫu như một PoC. ứng dụng đã hoạt động và mọi thứ đều ổn. Sau khi nâng cấp lên phiên bản 7u7 java mới, mã của tôi không còn hoạt động như trước đây nữa. Mã chạy và hiển thị trang web, nhưng không có sự kiện cử chỉ (paning/phóng to) nào được kích hoạt trên trang web (google maps) và vì lý do nào đó khi tôi clikc và kéo (như để xoay) tôi nhận được ngoại lệ kèm theo tôi không có ý nghĩa gì cả.nhúng Google Maps vào ứng dụng máy tính để bàn JavaFX 2.2 ném ngoại lệ và không thực hiện

Tôi sẽ đánh giá rất cao bất kỳ thông tin chi tiết nào mà ai đó có thể có trong việc nhúng bản đồ Google Maps trong ứng dụng JavaFX 2.2. Cảm ơn bạn trước sự giúp đỡ nào và/hoặc gợi ý

Tiếp theo là mã ứng dụng/HTML code của tôi và ném ngoại lệ:

JavaFX mã:

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 nạp vào Web xem:

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

ném ngoại lệ khi kéo trong giao diện 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) 

Trả lời

4

Dựa trên vấn đề Sergey liên kết, có vẻ như là một phần của vấn đề này là do một lỗi trong Google Maps v3 api và là kết quả một cho phép các sự kiện cảm ứng trong trình duyệt (panning không hoạt động với api Google Maps v3 trong Chrome với các sự kiện chạm được bật).

Chế độ xem web JavaFX 2.0.x (và 2.1.x) không có sự kiện chạm được triển khai, nhưng JavaFX 2.2 có, do đó một lý do cho sự khác biệt về hành vi giữa hai.

Là một công việc xung quanh bạn có thể sử dụng v2 of the google maps api không có lỗi này (ít nhất là cho đến khi phiên bản api đó diễn ra vào ngày 19 tháng 5 năm 2013). Hoặc bạn có thể sử dụng JavaFX 2.1 cho đến khi nhóm JavaFX và Google triển khai bản sửa lỗi/giải pháp thay thế. Hoặc bạn có thể tiếp tục tìm cách giải quyết khác như được đề xuất bởi Sergey hoặc biến thể của chúng hoạt động cho bạn.

+0

điều tốt nhất cần làm là hoàn nguyên về JavaFX 2.1. Như tôi đã nói trước đó, tôi đã thử quay lại 2.0.3 (đây là phiên bản cũ nhất cung cấp trên trang web của họ) và giao diện với Google Maps hoạt động tốt, nhưng cầu JavaScript đến JavaFX không được triển khai trên phiên bản đó và tôi yêu cầu cũng vậy. phiên bản duy nhất sẽ hoạt động với Google Maps và triển khai cầu JavaScript-JavaFX là 2.1 và tôi không thể tìm thấy bất kỳ đâu để tải xuống. Tôi cần phiên bản 2.1 32.Nếu bạn biết một nơi nào đó tôi có thể tải nó từ nó sẽ được rất nhiều đánh giá cao. – user1666216

+0

Xin lỗi thời gian chạy JavaFX 2.1 và sdk hiện tại [không phải nơi nó được cho là] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html), vì vậy tôi không biết tìm chúng ở đâu. – jewelsea

+0

Oracle hiện đã đặt [JavaFX 2.1 runtime và sdk] (http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javafx-419431.html) nơi chúng được cho là . – jewelsea

2

Điều này trông giống như một lỗi trong WebView, tôi sẽ gửi nó.

Là một workaround bạn có thể cung cấp một bộ xử lý kéo trống để WebView của bạn:

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

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

cập nhật: đã xảy ra sự cố http://javafx-jira.kenai.com/browse/RT-22914 –

+0

Có, tôi có thể làm điều đó. Nhưng tôi cần các chức năng của bản đồ google cơ bản. tôi cần sự kiện kéo để được chuyển tiếp đến trang web để bật paning. Tôi dint thinki đã đề cập đến nó nhưng không có sự kiện nào dường như được chuyển tiếp đến trang web (không có nhấp chuột, ngoại trừ các nút. Không có cuộn mouce và không kéo). – user1666216

+0

CẬP NHẬT: Tôi hoàn nguyên về JavaFX 2.0.3 và tham khảo jfxrt.jar từ đó. dường như mọi thứ đều hoạt động tốt trên phiên bản đó. nhận được panning và di chuyển và không có ngoại lệ ném. – user1666216

Các vấn đề liên quan