Google Haritalar ve JavaFX: JavaFX düğmesini tıkladıktan sonra haritada işaretçi göster


359

JavaFX uygulamamın bir Düğmesine tıkladığımda haritada bir işaretleyici görüntülemeye çalışıyorum. Bu düğmeye tıkladığımda, JSON dosyasındaki konumu yazdığımda, bu dosya haritayı içeren html dosyasına yüklenecektir. Sorun, html sayfasını tarayıcıda açtığımda mükemmel çalışıyor, ancak JavaFX'in web görünümünde hiçbir şey olmuyor ve nedenini bilmiyorum!

Bu html dosyası:

<!DOCTYPE html>
<html>
  <head>
  <title>Simple Map</title>
  <meta name="viewport" content="initial-scale=1.0">
  <meta charset="utf-8">
  <style>
  /* Always set the map height explicitly to define the size of the div
   * element that contains the map. */
  /*#map {
    height: 100%;
  }*/
  #map{width:100%;height:100%;margin:auto;}
  /* Optional: Makes the sample page fill the window. */
  html, body {
    height: 100%;
    margin: 0;
    padding: 0;
  }
</style>
</head>
<body>
<div id="map"></div>
<script>
  var map;
  var marker;
  // Multiple Markers
  var markers = [];
  var pos = {lat: 46.662388, lng: 0.3599617};
  var itinerary_markers = [];

  function initMap() {

    var currentLat, currentLng;//Latitude et longtitude courante

    $.ajax({
      url: 'https://maps.googleapis.com/maps/api/geocode/json?address=My+ADDRESS&key=MY_KEY',
      async: false,
      dataType: 'json',
      success: function (data) {
        currentLat = data.results[0].geometry.location.lat;
        currentLng = data.results[0].geometry.location.lng;
      }
    });

    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: currentLat, lng: currentLng},
      zoom: 15,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });


    /*MARQUEUR*/ 
    $.ajax({
        async: false,
        url: 'test.json',
        data: "",
        accepts:'application/json',
        dataType: 'json',
        success: function (data) {
            for (var i = 0; i < data.hydrants.length; i++) {
                markers.push( data.hydrants[i]);
            }
        }
    });

      var posi = new google.maps.LatLng(markers[0].Lat, markers[0].Lng);
      marker = new google.maps.Marker({
          position: posi,
          map: map,
          //title: markers[i][0]
          title: markers[0].Name
        });

  }
</script>

<script
    src="https://code.jquery.com/jquery-3.2.1.min.js"
    integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
    crossorigin="anonymous">
</script>


<script src="https://maps.googleapis.com/maps/api/js?key=MY_KEY&callback=initMap&language=fr"
async defer></script>

</body>
</html>

Düğmeyi tıklattığımda, (mükemmel çalışan) JSON dosyasını dolduruyorum ve sonra web görünümünü yenilemek için bunu yürütüyorum:

this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());

Daha önce de söylediğim gibi, dosyayı tarayıcıda açtığımda beklenen sonucu görüyorum, ancak JavaFX ile sorunun ne olduğunu bilmiyorum. Bunu yapmanın daha iyi bir yolu varsa lütfen söyle.

DÜZENLE:

Ben executeScript () yöntemini kullanarak JavaFX gelen Javascript doğrudan veri (GPS koordinatları) göndererek soruna bir çözüm buldum, bu yüzden iki platform arasında köprü olarak bir json dosyasına gerek yok. Bu, kodun nasıl göründüğüne bir örnektir:

eng.executeScript("updateMarker(" + lat + ", " + lng + ")");//eng is a WebEngine instance

Ve işte Javascript:

/*The initial latitude and longtitude*/
var currentLat = the latitude;
var currentLng = the longtitude;

function initMap() {

    map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: currentLat, lng: currentLng},
      zoom: 15,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    var posi = new google.maps.LatLng(currentLat, currentLng);
    marker = new google.maps.Marker({
        position: posi,
        map: map,
        visible: false
    });
  }

/*The method that is I call from JavaFX*/
function updateMarker(_lat, _lng){
    marker.setPosition({lat: _lat, lng: _lng});
    map.setCenter(new google.maps.LatLng(_lat, _lng));
    marker.setVisible(true);
  }

Yorumlarınız ve cevaplarınız ve reddit için özel bir atışınız için teşekkür ederiz.



1
Komut dosyası mümkün olan en iyi şekilde yazılmamasına rağmen, yanlış bir şey görünmüyor. Çalışmaması için birkaç olasılık vardır. Yeni işaretçinin json dosyasının en üstüne eklendiğinden emin olun. Geçiş cache: falseönbelleğe durumunda ajax çağrıya ve lütfen doğru dosyayı hedef olun. Ayrıca burada bazı günlükler ve sorunu belirlemek yardımcı olacaktır.
Gökhan Kurt

1
JavaFX öğesinin test.json gibi HTTP tarafından sunulmayan uç noktalardan çağrı / veri almak için ajax kullanmayla ilgili sorunları olabilir mi?
Sebastian

@Sebastian Beni deli eden şey, uygulamayı açtığımda json dosyasının doğru yüklendiğini ve beklenen sonucu gördüğümdür. Sorun json dosyasını başka bir değerle güncellediğimde (uygulama açıkken) yeni işaretçiyi görüntülemek için yenilemek istemiyor! Yani ajax çağrıları ile ilgili bir sorun yok. Ama geri arama meselesi olabilir mi? çünkü sayfa yüklenirken initMap () çağrılır
Chandler Bing

@ GökhanKurt yukarıdaki cevabı okur musunuz
Chandler Bing

Yanıtlar:


70

Tahmin etmek zorunda kalsaydım - iki şeyden biri oluyor:

Ya A) javaFX'iniz siteler arası ajax çağrılarını desteklemiyor ya da B) asenkron ajax yanıtını beklemiyor / başka bir şey ters gidiyor.

Şimdi birlikte bazı testler yapalım. Öncelikle ajax çağrılarını yerleştirmek için bunu temizleyebilir miyiz? Ardından, her birinin ne gönderdiğini öğrenmek için bazı console.log ifadeleri ekleyebilir misiniz? Bazı çıktıları kaçırırsanız, nerede yanlış gittiğini biliyoruz ve bu da işleri düzeltmemize yardımcı olacaktır.

Not Başarıyı biraz eski olduğu için başarıyı 'tamamlandı' olarak değiştirdim ve her şey, bir sonraki çağrılara herhangi bir boşluk gönderilip gönderilmeyeceği sorusunu ortadan kaldırmak için iç içe geçmiştir (eşzamanlılık sorunları):

$.ajax({
    url: 'https://maps.googleapis.com/maps/api/geocode/json?address=My+ADDRESS&key=MY_KEY',
    async: false,
    dataType: 'json'
}).done(function(data) {
    currentLat = data.results[0].geometry.location.lat;
    currentLng = data.results[0].geometry.location.lng;
    console.log(currentLat);
    console.log(currentLng);
    // Multiple Markers
    var markers = [];
    var pos = {lat: 46.662388, lng: 0.3599617};
    var itinerary_markers = [];
    var map = new google.maps.Map(document.getElementById('map'), {
        center: {lat: currentLat, lng: currentLng},
        zoom: 15,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    console.log(map);
    /*MARQUEUR*/ 
    $.ajax({
        async: false,
        url: 'test.json',
        data: "",
        accepts:'application/json',
        dataType: 'json'
    }).done(function(data) {
        for (var i = 0; i < data.hydrants.length; i++) {
            markers.push( data.hydrants[i]);
        }
        console.log(markers);
        var posi = new google.maps.LatLng(markers[0].Lat, markers[0].Lng);
        console.log(posi);
        var marker = new google.maps.Marker({
            position: posi,
            map: map,
            //title: markers[i][0]
            title: markers[0].Name
        });
        console.log(marker);
    }).fail(function(jqXHR, testStatus){
        console.log(textStatus);
    });
}).fail(function(jqXHR, testStatus){
    console.log(textStatus);
});

Bu bir sorun varsa console.log çıktısını Java'da System.out'a almak için bir bağlantı var: JavaFX 8 WebEngine: javascript'ten java'da system.out'a konsol.log () nasıl alınır?

... Reddit'ten de merhaba.


Merhaba, bu yüzden sorunun ajax çağrıları ile olduğunu düşünüyorum. Tamam, javascript (executescript kullanarak) GPS konumlarını göndermek için başka bir yol bulmaya çalışacağım.
Chandler Bing

Hayır, ajax çağırmaz. Sorun, yeni işaretçiyi göstermek için web görünümünü yenileyemem. Uygulamayı açtığımda, harita görüntülenir, bu da ajax çağrılarının iyi çalıştığı anlamına gelir.
Chandler Bing

18

Çizgide:

this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());

Dosya yolunun doğru olup olmadığını iki kez kontrol etmeyi denerdim. StackOverflow'daki diğer yanıtları okurken, bunun paket köküne göreli ve baştaki '/' ile veya '/' olmadan olması gerekiyor gibi görünüyor. yani getResource("data/index.html"). Ancak, yine, belki de zaten ilgili hatalar görüyorsunuz getResource()...

Bir sonraki gideceğim, hata ayıklama amacıyla, JSON yazdığınız kısmı yorumlamak ve sadece elle bazı iyi JSON yazmak ve sadece webView'da görünmesini sağlamaya çalışmak olacaktır. Ne kadar az hareketli parça olursa o kadar iyidir. Önceden yazılmış JSON ile çalışmasını sağlayabiliyorsanız, Java ile yazdığınız JSON ile ilgili bir sorun olduğunu ve ardından HTML'ye yüklendiğini varsayabilirsiniz.

Düzenleme: Biraz daha derin kazdık. Bu yine tamamen yanlış olabilir, ancak initMap()web tarayıcınızın normalde onload çağırdığı işlevi Java'dan elle çağırmayı deneyebilirsiniz . Düğmeye tıklandığında JavaFX WebView'dan bir JavaScript işlevi nasıl çağrılır? biraz daha detayı var. this.webView.getEngine().executeScript("initMap()");Düğmenizle JSON'u düzenledikten sonra deneyin .

Düzenle 2 Bir yana, haritanın başlaması ve ardından haritadaki işaretçileri ayarlamak için initMapbir initMapve updateMapişlevine bölünmek mantıklı olabilir . Rağmen bu bir şey kırmak zor.


Sorun değil, bu uygulamayı kullanarak uygulamayı açtığımda haritayı görüntülüyorum. Fakat bir düğmeyi tıkladığımda haritaya bir işaret koymak istiyorum. Ama üzerinde işaretçiyi göstermek için haritayı yenileyemiyorum.
Chandler Bing

1
Ah, yakaladım. Yanlış anlamışım. Temel sayfanın yüklendiğini, ancak hiçbir işaretleyicinin yüklenmediğini mi söylüyorsunuz? Harita en azından webView'inizde mi görünüyor? Yukarıda initMap'te belirttiğiniz gibi bir şey üzerinde olabileceğinizi düşünüyorum. Bu işlevi yalnızca sayfa yüklemesinde çağırıyorsa, muhtemelen json üzerinde düzenlemeler almaz. Web görünümünde sayfayı yenilemeniz veya sayfaya bir şekilde tekrar initMap'i çağırmasını söylemeniz gerekir - belki de ajax aracılığıyla? JavaFX javascript işlevlerini çağırmak için webView alamazsa
Matt

Uygulama açıldığında json dosyasında bulunan her şey yüklenir. Ancak uygulama açıkken bir değeri değiştirdiğimde, değişikliği görmek için web görünümünü yenilemek istiyorum. Ama işe yaramıyor! Sorun bu.
Chandler Bing

1
Düzenlememe bakın - Java'dan initMap işlevine manuel arama eklemek yardımcı oluyor mu?
Matt

4

Fare tekerleğiniz haritayı yakınlaştırmak veya içeri yakınlaştırmak için kullanılıyorsa ve işaretçi görünürse, aynı sorunu yaşıyorum.

İşaretçileri geri yüklemek için harita görünümünü manuel olarak yakınlaştırmayı deneyin. Yol Tarifi Hizmetinden bir rota görüntülerken de bu tekniği kullanmak zorunda kaldım, aksi halde ara nokta işaretleyicileri düzgün görüntülenmiyordu.

Bunu yapmak için Javafx denetleyici sınıfındaki kod budur:

KeyFrame kf1 = new KeyFrame(Duration.seconds(0.75), e -> map.setZoom(map.getZoom() - 1));
KeyFrame kf2 = new KeyFrame(Duration.seconds(1.5), e -> map.setZoom(map.getZoom() + 1));
Timeline timeline = new Timeline(kf1, kf2);
Platform.runLater(timeline::play);

Bu, JavaFX WebView üzerinde javascript motoru çağrıları etrafında ince bir Java sarıcı olan GMapsFX kullanıyordu. Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.