Próbowałem wyświetlić znacznik na mapie po kliknięciu przycisku mojej aplikacji JavaFX. Tak więc dzieje się, gdy klikam ten przycisk, zapisuję pozycję w pliku JSON, plik ten zostanie załadowany do pliku HTML zawierającego mapę. Problem polega na tym, że działa idealnie, gdy otwieram stronę html w przeglądarce, ale w widoku JavaFX nic się nie dzieje i nie wiem dlaczego!
To jest plik HTML:
<!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>
Po kliknięciu przycisku wypełniam plik JSON (który działa idealnie), a następnie uruchamiam go, aby odświeżyć widok:
this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());
Jak powiedziałem wcześniej, kiedy otwieram plik w przeglądarce, widzę oczekiwany wynik, ale nie wiem na czym polega problem z JavaFX. Jeśli istnieje lepszy sposób, aby to zrobić, proszę mi powiedzieć.
EDYTOWAĆ:
Znalazłem rozwiązanie problemu, wysyłając bezpośrednio dane (współrzędne GPS) z JavaFX do Javascript przy użyciu metody executeScript (), więc nie potrzebuję pliku json jako pomostu między dwiema platformami. To jest przykład tego, jak wygląda kod:
eng.executeScript("updateMarker(" + lat + ", " + lng + ")");//eng is a WebEngine instance
A oto 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);
}
Dziękujemy za komentarze i odpowiedzi oraz specjalną strzelaninę do redditu.
źródło
cache: false
do wywołania ajax, jeśli jest buforowane, i upewnij się, że wybrałeś właściwy plik. Również niektóre logi tu i tam pomogą zidentyfikować problem.Odpowiedzi:
Gdybym musiał zgadywać - dzieje się jedna z dwóch rzeczy:
Albo A) twój javaFX nie obsługuje wywołań ajax dla wielu witryn lub B) nie czeka na asynchroniczną odpowiedź ajax / coś innego się nie udaje.
Więc zróbmy razem kilka testów. Po pierwsze, czy możemy to wyczyścić, aby zagnieżdżać wywołania ajax? Następnie możesz dodać niektóre instrukcje console.log, aby dowiedzieć się, co każda z nich odsyła? Jeśli przegapisz jakieś wyjście, wiemy, gdzie idzie źle, i to pomoże nam to naprawić.
Uwaga Zmieniłem sukces na „gotowe” dodatki, ponieważ sukces jest nieco nieaktualny, a wszystko jest zagnieżdżone, aby wyeliminować pytanie, czy jakieś puste są wysyłane do następnych połączeń (problemy z synchronizacją):
Oto link dotyczący wprowadzania danych wyjściowych console.log do System.out w Javie, jeśli jest to problem: JavaFX 8 WebEngine: Jak uzyskać console.log () z javascript do System.out w Javie?
... również witam z reddit.
źródło
W linii:
Spróbowałbym dwukrotnie sprawdzić, czy ścieżka do pliku jest poprawna. Czytając inne odpowiedzi na StackOverflow, wygląda na to, że powinno to być względne względem katalogu głównego pakietu i albo z wiodącym '/' lub bez niego. to znaczy
getResource("data/index.html")
. Ale z drugiej strony, być może zobaczysz już błędy związane zgetResource()
...Następnym krokiem do debugowania będzie komentarz do części, w której piszesz JSON, i po prostu ręcznie napisz dobry JSON i po prostu spróbuj go wyświetlić w webView. Im mniej części ruchomych, tym lepiej. Jeśli możesz zmusić go do pracy ze wstępnie napisanym JSON, możesz założyć, że jest jakiś problem z JSON, który piszesz w Javie, a następnie jest ładowany do HTML.
Edycja: Kopałem trochę głębiej. Może to znowu być całkowicie błędne, ale może możesz spróbować ręcznie wywołać
initMap()
funkcję z Javy, którą przeglądarka zwykle wywołuje podczas ładowania. Jak wywołać funkcję JavaScript z JavaFX WebView po kliknięciu przycisku? ma więcej szczegółów. Spróbujthis.webView.getEngine().executeScript("initMap()");
po edycji JSON za pomocą przycisku.Edycja 2 Nawiasem mówiąc, sensowne może być podzielenie
initMap
na funkcjęinitMap
iupdateMap
rozpoczęcie mapy od ustawienia, a następnie ustawienie znaczników na mapie. Chociaż to prawie nic nie psuje.źródło
Jeśli kółko myszy służy do pomniejszania lub przybliżania mapy i pojawia się znacznik, oznacza to, że mam ten sam problem, co ja.
Spróbuj ręcznie powiększyć widok mapy, aby przywrócić znaczniki. Musiałem także zastosować tę technikę podczas wyświetlania trasy z usługi kierowania, w przeciwnym razie znaczniki punktów trasy nie byłyby wyświetlane poprawnie.
Oto kod w mojej klasie kontrolera Javafx, aby to zrobić:
Wykorzystano GMapsFX, który jest cienkim opakowaniem Java wokół wywołań silnika javascript w JavaFX WebView. Mam nadzieję, że to pomaga.
źródło