গুগল ম্যাপস এবং জাভাএফএক্স: জাভাএফএক্স বোতামটি ক্লিক করার পরে মানচিত্রে চিহ্নিতকারী প্রদর্শন করুন


359

আমি আমার জাভাএফএক্স অ্যাপ্লিকেশনটির একটি বোতামে ক্লিক করলে আমি মানচিত্রে একটি চিহ্নিতকারী প্রদর্শন করার চেষ্টা করছি। সুতরাং যখন আমি সেই বোতামটিতে ক্লিক করি তখন কী হয় তা আমি একটি জেএসওএন ফাইলে অবস্থানটি লিখি, এই ফাইলটি এইচটিএমএল ফাইলটিতে লোড হবে যাতে মানচিত্র রয়েছে। সমস্যাটি হ'ল আমি ব্রাউজারে এইচটিএমএল পৃষ্ঠা খুললে এটি পুরোপুরি কাজ করে তবে জাভাএফএক্সের ওয়েব ভিউতে কিছুই ঘটে না, এবং কেন জানি না!

এটি এইচটিএমএল ফাইল:

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

আমি যখন বোতামটি ক্লিক করি তখন আমি JSON ফাইলটি পূরণ করি (যা নিখুঁতভাবে কাজ করে) এবং তারপরে আমি ওয়েব ভিউ রিফ্রেশ করার জন্য এটি সম্পাদন করি:

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

যেমনটি আমি আগেই বলেছি, আমি যখন ব্রাউজারে ফাইলটি খুলি তখন আমি প্রত্যাশিত ফলাফলটি দেখতে পাই, তবে জাভাএফএক্স-এ সমস্যা কী তা আমি জানি না। এটি করার আরও ভাল উপায় যদি থাকে তবে আমাকে বলুন।

সম্পাদনা করুন:

এক্সিকিউটসস্ক্রিপ্ট () পদ্ধতিটি ব্যবহার করে জাভাএফএক্স থেকে জাভাস্ক্রিপ্টে সরাসরি ডেটা (জিপিএস স্থানাঙ্ক) প্রেরণ করে সমস্যার সমাধান খুঁজে পেয়েছি, সুতরাং দুটি প্ল্যাটফর্মের মধ্যে ব্রিজ হিসাবে আমার কোনও জেসন ফাইলের প্রয়োজন নেই। সুতরাং কোডটি কেমন দেখাচ্ছে তার এটি উদাহরণ:

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

এবং এখানে জাভাস্ক্রিপ্ট:

/*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);
  }

আপনার মন্তব্য এবং উত্তর, এবং reddit একটি বিশেষ শুটআউট জন্য আপনাকে ধন্যবাদ।


48
রেফারেন্সের জন্য: reddit.com/r/PramrammerHumor/comments/6e6wu6/…
মাতেন উলহাক

1
যদিও স্ক্রিপ্টটি সর্বোত্তমভাবে লেখা হয়নি, এটিতে কোনও ভুল বলে মনে হচ্ছে না। এমন বেশ কয়েকটি সম্ভাবনা রয়েছে যা এটি কার্যকর না করে। নিশ্চিত করুন যে নতুন মার্কারটি জেসন ফাইলের শীর্ষে যুক্ত হয়েছে। cache: falseএটি ক্যাশেড হওয়ার ক্ষেত্রে এজাক্স কলটি পাস করুন এবং নিশ্চিত করুন যে আপনি সঠিক ফাইলটি লক্ষ্যবস্তু করেছেন। এছাড়াও কিছু লগ এখানে এবং সেখানে সমস্যা সনাক্ত করতে সহায়তা করবে।
গোখন কুর্ট

1
এটি কি হতে পারে যে জাভাএফএক্স জিনিসটি আপনার টেস্ট.জসনের মতো নন-এইচটিপি-র পরিবেশিত শেষ পয়েন্টগুলি থেকে কল / ডেটা গ্রহণ করতে এজ্যাক্স ব্যবহার করতে সমস্যা করে?
সেবাস্তিয়ান

@ সেবাস্তিয়ান হোয়াটস আমাকে পাগল করছে তা হ'ল আমি অ্যাপটি খুললে জসন ফাইলটি সঠিকভাবে লোড হয় এবং আমি প্রত্যাশিত ফলাফলটি দেখতে পাই। সমস্যাটি হ'ল যখন আমি জন্সন ফাইলটিকে অন্য একটি মান দিয়ে আপডেট করি (অ্যাপটি খোলা থাকে) তখন এটি নতুন মার্কারটি প্রদর্শনের জন্য কেবল রিফ্রেশ করতে চায় না! তাই এজ্যাক্স কলগুলির সাথে কোনও সমস্যা নেই। কিন্তু এটি কলব্যাক জিনিস হতে পারে? কারণ পৃষ্ঠাটি লোড হওয়ার সময় initMap () ডাকা হয়
বিং

@ গোখানকুর্ট আপনি কি উপরের উত্তরটি পড়বেন
বিং

উত্তর:


70

যদি আমার অনুমান করতে হয় - দুটি জিনিসের একটি ঘটছে:

হয় এ) আপনার জাভাএফএক্স ক্রস সাইট আজাক্স কল বা বি সমর্থন করে না) এটি অ্যাসিঙ্ক্রোনাস এজাক্স প্রতিক্রিয়াটির জন্য অপেক্ষা করছে না / অন্য কোনও কিছু ভুল হয়ে যাচ্ছে।

সুতরাং আসুন একসাথে কিছু পরীক্ষা করা যাক। প্রথমত আমরা এজ্যাক্স কলগুলিকে বাসা বাঁধতে পরিষ্কার করতে পারি? তারপরে আপনি কিছু কনসোল.লগ স্টেটমেন্টে যুক্ত করতে পারবেন যাতে প্রত্যেকে কী পাঠাচ্ছে তা জানতে? আপনি যদি কিছু আউটপুট মিস করেন তবে আমরা জানি কোথায় এটি ভুল হচ্ছে এবং এটি আমাদের জিনিসগুলি ঠিক করতে সহায়তা করবে।

দ্রষ্টব্য আমি সাফল্যটিকে 'সম্পন্ন' সংযোজনগুলিতে পরিবর্তন করেছি কারণ সাফল্যটি কিছুটা পুরানো,

$.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);
});

জাভাতে সিস্টেম.আউটে কনসোল.লগ আউটপুট পাওয়ার বিষয়ে একটি লিঙ্ক এখানে রয়েছে: জাভাএফএক্স 8 ওয়েবজাইন: জাভায় স্ক্রিপ্ট থেকে সিস্টেম.আউটে কনসোল.লগ () কীভাবে পাবেন?

... রেডডিট থেকে হ্যালো।


হাই, এখানে আপনি কী ভাবেন যে এজ্যাক্স কলগুলির সাথে সমস্যা। ঠিক আছে, আমি জাভাস্ক্রিপ্টে জিপিএস অবস্থানগুলি প্রেরণের (এক্সিকিউটস স্ক্রিপ্ট ব্যবহার করে) অন্য কোনও উপায় সন্ধান করার চেষ্টা করব।
বিং

না এটি আজকের কল নয়। সমস্যাটি হ'ল নতুন মার্কারটি দেখানোর জন্য আমি ওয়েব ভিউ রিফ্রেশ করতে পারি না। আমি যখন অ্যাপটি খুলি, মানচিত্রটি প্রদর্শিত হয় যার অর্থ এজাক্স কলগুলি ঠিকঠাক কাজ করে।
চ্যান্ডলার বিং

18

লাইনের মাঝে:

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

আমি চেষ্টা করব ফাইলটি সঠিকভাবে ডাবল-যাচাই করার জন্য। স্ট্যাকওভারফ্লোতে অন্য উত্তরগুলি পড়া, দেখে মনে হচ্ছে এটি প্যাকেজ রুটের সাথে সম্পর্কিত এবং নেতৃস্থানীয় '/' এর সাথে বা ছাড়াও। অর্থাত getResource("data/index.html")। তবে, আবার, সম্ভবত আপনি ইতিমধ্যে সম্পর্কিত ত্রুটি দেখতে পাবে getResource()...

আমার পরের ডিবাগিংয়ের উদ্দেশ্যে, আপনি যে অংশটি JSON লিখেছেন সেখান থেকে কিছু মন্তব্য করতে হবে এবং ম্যানুয়ালি কিছু ভাল JSON লিখতে হবে এবং এটি ওয়েবভিউতে দেখানোর চেষ্টা করার চেষ্টা করবে। যত কম চলমান অংশগুলি তত ভাল। আপনি যদি এটি আপনার পূর্ব-লিখিত জেএসওএন দিয়ে কাজ করতে পারেন তবে ধরে নিতে পারেন যে আপনি জাভা দিয়ে লিখছেন এমন JSON এবং তারপরে এটি HTML এ লোড হচ্ছে এতে কিছু সমস্যা being

সম্পাদনা: আমি কিছুটা গভীর খনন করেছি। এটি আবার সম্পূর্ণ ভুল হতে পারে তবে আপনি initMap()জাভা থেকে ফাংশনটিতে ম্যানুয়ালি কল করার চেষ্টা করতে পারেন যা আপনার ওয়েব ব্রাউজারটি সাধারণত লোড কল করে। বাটনে ক্লিক করে জাভাসএফএক্স ওয়েবভিউ থেকে জাভাস্ক্রিপ্ট ফাংশনটি কীভাবে কল করবেন? আরও কিছু বিবরণ আছে। this.webView.getEngine().executeScript("initMap()");আপনি আপনার বোতামটি দিয়ে JSON সম্পাদনা করার পরে চেষ্টা করুন ।

সম্পাদনা 2 একদিকে যেমন, এটির initMapমধ্যে বিভক্ত হওয়া initMapএবং updateMapমানচিত্রটি শুরু করতে এবং তারপরে মানচিত্রে চিহ্নিতকারীগুলিকে সেট করার জন্য ফাংশনটি বোধ করতে পারে । যদিও এটি খুব কমই কিছু ভঙ্গ করছে।


কোনও সমস্যা হবেনা, আমি অ্যাপটি খুললে আমি লাইনটি ব্যবহার করি আমি মানচিত্রটি প্রদর্শন করি। তবে আমি যখন একটি বোতামে ক্লিক করি তখন আমি মানচিত্রে একটি চিহ্নিতকারী রাখতে চাই। তবে আমি এটিতে চিহ্নিতকারীটি দেখানোর জন্য মানচিত্রটি রিফ্রেশ করতে পারি না।
বিং

1
আহ, গোছা। আমি ভুল বুঝেছিলাম. আপনি কি বলছেন যে বেসিক পৃষ্ঠাটি লোড হচ্ছে তবে কোনও চিহ্নিতকারী লোড হচ্ছে না? আপনার ওয়েবভিউতে মানচিত্রটি কি অন্তত প্রদর্শিত হচ্ছে? আমি মনে করি যে আপনি উপরের initMap হিসাবে উল্লেখ করেছেন তেমন কিছু হতে পারে। যদি এটি কেবল পৃষ্ঠা লোডে সেই ফাংশনটি কল করে তবে সম্ভবত এটি জসন-এ সম্পাদনা পাচ্ছে না। আপনাকে ওয়েবভিউয়ের মধ্যে পৃষ্ঠাটি রিফ্রেশ করতে হবে বা পৃষ্ঠাটি আবার ইন-ম্যাক কল করতে বলতে হবে - অজ্যাক্সের মাধ্যমে - মাইবে? জাভাএফএক্স না হলে জাভাস্ক্রিপ্ট ফাংশনগুলি কল করতে ওয়েবভিউটি না পেতে পারে
ম্যাট

অ্যাপ্লিকেশনটি যখন খোলা থাকে তখন জসন ফাইলে বিদ্যমান সমস্ত কিছু লোড হয়। তবে আমি যখন অ্যাপ্লিকেশনটি খোলার সময় কোনও মান পরিবর্তন করি, পরিবর্তনটি দেখতে আমি ওয়েবদর্শনটি রিফ্রেশ করতে চাই। কিন্তু এটা ঠিক কাজ করে না! এটাই সমস্যা.
বিং

1
আমার সম্পাদনা দেখুন - কি জাভা থেকে ইনিম্যাপ ফাংশন সহায়তাটিতে ম্যানুয়াল কল যুক্ত করা হচ্ছে?
ম্যাট

4

যদি আপনার মাউস-হুইলটি মানচিত্রটিকে জুম বা আউট বা বাইরে জুম করতে ব্যবহৃত হয় এবং চিহ্নিতকারী উপস্থিত হয়, তবে আপনি যে একই সমস্যাটি করেছিলেন তা আপনি একইভাবে अनुभव করছেন।

চিহ্নিতকারীদের পুনরুদ্ধার করতে মানচিত্রের দৃশ্যটি জুম করার চেষ্টা করুন। দিকনির্দেশ পরিষেবা থেকে কোনও রুট প্রদর্শন করার সময় আমাকেও এই কৌশলটি কাজে লাগাতে হয়েছিল, অন্যথায় উপায়পয়েন্ট চিহ্নিতকারীগুলি সঠিকভাবে প্রদর্শন করছে না।

এটি করার জন্য আমার জাভাফেক্স নিয়ামক শ্রেণীর কোডটি:

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

এটি জিএমএফএক্সএফএক্স ব্যবহার করছিল, যা জাভাএফএক্স ওয়েবভিউতে জাভাস্ক্রিপ্ট ইঞ্জিন কলগুলির চারপাশে কেবল পাতলা জাভা র‍্যাপার। আশা করি এটি সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.