Eu tenho tentado exibir um marcador no mapa quando clico em um botão do meu aplicativo JavaFX. Então, o que acontece é que, quando clico nesse botão, escrevo a posição em um arquivo JSON, esse arquivo será carregado no arquivo html que contém o mapa. O problema é que ele funciona perfeitamente quando abro a página html no navegador, mas nada acontece na exibição da Web do JavaFX e não sei por que!
Este é o arquivo 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>
Quando clico no botão, preencho o arquivo JSON (que funciona perfeitamente) e, em seguida, executo-o para atualizar a visualização da web:
this.webView.getEngine().load(getClass().getResource("/data/index.html").toString());
Como eu disse antes, quando abro o arquivo no navegador, vejo o resultado esperado, mas não sei qual é o problema com o JavaFX. Se houver uma maneira melhor de fazer isso, por favor me diga.
EDITAR:
Encontrei uma solução para o problema enviando diretamente os dados (as coordenadas GPS) de JavaFX para Javascript usando o método executeScript (), para que não precise de um arquivo json como ponte entre as duas plataformas. Portanto, este é um exemplo de como o código se parece:
eng.executeScript("updateMarker(" + lat + ", " + lng + ")");//eng is a WebEngine instance
E aqui está o 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);
}
Obrigado por seus comentários e respostas, e um tiroteio especial para reddit.
fonte
cache: false
para a chamada ajax, caso esteja em cache, e tenha como alvo o arquivo certo. Além disso, alguns logs aqui e ali ajudariam a identificar o problema.Respostas:
Se eu tivesse que adivinhar - uma das duas coisas está acontecendo:
A) seu javaFX não suporta chamadas ajax entre sites ou B) não aguarda a resposta assíncrona do ajax / algo está errado.
Então, vamos fazer alguns testes juntos. Em primeiro lugar, podemos limpar isso para aninhar as chamadas ajax? Em seguida, você pode adicionar algumas instruções console.log para descobrir o que cada uma está enviando de volta? Se você perder alguma saída, sabemos onde está dando errado e isso nos ajudará a consertar as coisas.
Observe que mudei o sucesso para as adições 'concluídas' porque o sucesso está um pouco desatualizado e tudo está aninhado para eliminar a questão de saber se algum espaço em branco está sendo enviado para as próximas chamadas (problemas de sincronicidade):
Aqui está um link para obter a saída console.log para System.out em Java, se este for um problema: JavaFX 8 WebEngine: Como obter console.log () de javascript para System.out em java?
... Olá também do reddit.
fonte
Na linha:
Eu tentaria verificar duas vezes o caminho para o arquivo está correto. Lendo outras respostas no StackOverflow, parece que isso deve ser relativo à raiz do pacote e com ou sem o '/' inicial. ie
getResource("data/index.html")
. Mas, novamente, talvez você já esteja vendo erros relacionados agetResource()
...Meu próximo passo, para fins de depuração, seria comentar a parte em que você escreve o JSON e apenas escrever manualmente um bom JSON e apenas tentar fazê-lo aparecer no webView. Quanto menos partes móveis, melhor. Se você conseguir que ele funcione com seu JSON pré-escrito, poderá assumir que há algum problema com o JSON que você está escrevendo com Java e, em seguida, sendo carregado no HTML.
Edit: Eu cavei um pouco mais fundo. Isso pode estar totalmente errado novamente, mas talvez você possa tentar chamar manualmente a
initMap()
função de Java que seu navegador normalmente chama de onload. Como chamar uma função JavaScript de um JavaFX WebView no botão Clique? tem mais alguns detalhes. Tentethis.webView.getEngine().executeScript("initMap()");
depois de editar o JSON com seu botão.Editar 2 Como um aparte, também, pode fazer sentido dividir-se
initMap
em uma funçãoinitMap
eupdateMap
para fazer o mapa começar e depois definir os marcadores no mapa. Embora isso dificilmente esteja quebrando alguma coisa.fonte
Se a roda do mouse for usada para ampliar ou reduzir o mapa e o marcador aparecer, você está enfrentando o mesmo problema que eu.
Tente ampliar manualmente a visualização do mapa para restaurar os marcadores. Eu também tive que empregar essa técnica ao exibir uma rota no serviço de rotas, caso contrário, os marcadores do waypoint não estavam sendo exibidos corretamente.
Este é o código na minha classe de controlador Javafx para fazer isso:
Isso estava usando o GMapsFX, que é apenas um fino invólucro Java em torno das chamadas do mecanismo javascript em um JavaFX WebView. Espero que ajude.
fonte