{"id":2953714,"date":"2026-01-13T10:00:07","date_gmt":"2026-01-13T18:00:07","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2953714"},"modified":"2026-03-24T12:27:02","modified_gmt":"2026-03-24T19:27:02","slug":"using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","title":{"rendered":"Using ArcGIS Maps SDK for Qt in a JavaFX based application"},"author":372342,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191],"tags":[],"industry":[],"product":[769162],"class_list":["post-2953714","blog","type-blog","status-publish","format-standard","hentry","category-developers","product-sdk-java"],"acf":{"authors":[{"ID":5331,"user_firstname":"Lucas","user_lastname":"Danzinger","nickname":"Lucas Danzinger","user_nicename":"ldanzinger","display_name":"Lucas Danzinger","user_email":"LDanzinger@esri.com","user_url":"","user_registered":"2018-03-02 00:17:04","user_description":"Lucas is a Product Engineering Lead, dedicating the majority of his efforts to the Qt Maps SDK and advancing the geometry editing capabilities within the Maps SDKs for Native Apps. Outside of his professional pursuits, he enjoys outdoor activities, traveling, and culinary exploration.","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/9941353aad6686462149f10834e13f19b4615b89008d87cd496ba9be49cf55a5?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/9941353aad6686462149f10834e13f19b4615b89008d87cd496ba9be49cf55a5?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"short_description":"One way to extend the life of your JavaFX based app is to embed a map control from Qt Maps SDK into it.","flexible_content":[{"acf_fc_layout":"content","content":"<details>\n<summary><span style=\"color: #800080;\">Why this article?<\/span><\/summary>\n<div>\n<p>As we move forward with the evolution of ArcGIS Maps SDKs, many customers have shared their migration plans and ideas. For some, transitioning to <a href=\"https:\/\/developers.arcgis.com\/qt\/\">ArcGIS Maps SDK for Qt<\/a> or <a href=\"https:\/\/developers.arcgis.com\/net\/\">ArcGIS Maps SDK for .NET<\/a> is a great opportunity to take advantage of modern frameworks and capabilities. However, we also recognize that some applications are deeply integrated with JavaFX, featuring complex user interfaces and system connections. For these teams, a full migration may not be practical.<\/p>\n<p>To support these scenarios, we\u2019ve explored ways to make the transition smoother. One option is embedding the map control from another ArcGIS Native Maps SDK into existing JavaFX applications. This approach allows developers to replace the <a href=\"https:\/\/developers.arcgis.com\/java\/\">ArcGIS Maps SDK for Java<\/a> component without rewriting the entire app, while still benefiting from the latest enhancements and bug fixes available in ArcGIS Maps SDK for Native Apps.<\/p>\n<\/div>\n<\/details>\n<p>This blog post explores a technique of using ArcGIS Maps SDK for Qt as a map control in a JavaFX based application and includes these sections:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#arch\">High-level architecture<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#render\">Rendering a MapView (how to draw a map)<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#callmethod\">Calling a Qt method from Java<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#listen\">Listening to events between Java and Qt<\/a><\/li>\n<li><a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#req\">Software requirements for Qt<\/a><\/li>\n<\/ul>\n<p>The example code created for this blog post is available in <a href=\"https:\/\/github.com\/aji13187\/JavaFxQt\">the JavaFxQt GitHub repo<\/a>. Please note that we intend this to showcase one proof-of-concept example of how this can work, and there may be alternative patterns to consider instead.<\/p>\n<p><em>Note: For brevity\u2019s sake, code snippets throughout this blog have been slightly modified from the original code to remove things like null checks, error checks, and state management.<\/em><\/p>\n<h2 id=\"arch\">High-level architecture<\/h2>\n<p>The high-level architecture of the example is based on three primary concepts:<\/p>\n<ol>\n<li><span data-contrast=\"auto\">A JavaFX application<\/span><span data-contrast=\"auto\">,<\/span><span data-contrast=\"auto\">\u00a0which\u00a0represents\u00a0the main application. This application\u00a0contains\u00a0the primary user interface that users will interact with. This\u00a0app\u00a0is referred to\u00a0as\u00a0JavaFX\u00a0App\u00a0in the diagram below.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">A Qt project that is built as a dynamic library instead of an executable application. This project uses ArcGIS Maps SDK for Qt to display a\u00a0<code>MapView<\/code>,\u00a0and\u00a0is\u00a0referred to as\u00a0<\/span><span data-contrast=\"auto\">\u201cQtMapApp.dll\u201d<\/span><span data-contrast=\"auto\">\u00a0in the diagram below.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<li><span data-contrast=\"auto\">A Java Native Interface (JNI) bridge that handles the communication between Java and C++.\u00a0This bridge does several things including initializing the environment, exposing methods from Qt to Java, and exposing Java methods to Qt, which will be used as callbacks.\u00a0This class is referred to as \u201cJniBridge\u201d in the diagram below.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/li>\n<\/ol>\n"},{"acf_fc_layout":"image","image":{"ID":2953716,"id":2953716,"title":"diagram-qt-to-java","filename":"diagram-qt-to-java.png","filesize":35548,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\/diagram-qt-to-java","alt":"Diagram showing JniBridge as the go-between for the Qt control and the JavaFX app","author":"372342","description":"","caption":"","name":"diagram-qt-to-java","status":"inherit","uploaded_to":2953714,"date":"2026-01-11 06:56:05","modified":"2026-01-11 06:57:55","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":681,"height":238,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","medium-width":464,"medium-height":162,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","medium_large-width":681,"medium_large-height":238,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","large-width":681,"large-height":238,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","1536x1536-width":681,"1536x1536-height":238,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","2048x2048-width":681,"2048x2048-height":238,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","card_image-width":681,"card_image-height":238,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/diagram-qt-to-java.png","wide_image-width":681,"wide_image-height":238}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2 id=\"render\">Rendering a MapView<\/h2>\n<p>The first major milestone in integrating a Qt <code>MapView<\/code> within a JavaFX application is to render the map. Upon building and running the JavaFXApp example project, you\u2019ll see a UI like this:<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2953717,"id":2953717,"title":"map-qt-to-java","filename":"map-qt-to-java.png","filesize":472970,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\/map-qt-to-java","alt":"World map with three buttons above it","author":"372342","description":"","caption":"","name":"map-qt-to-java","status":"inherit","uploaded_to":2953714,"date":"2026-01-11 07:02:57","modified":"2026-01-11 07:03:49","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":901,"height":629,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","medium-width":374,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","medium_large-width":768,"medium_large-height":536,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","large-width":901,"large-height":629,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","1536x1536-width":901,"1536x1536-height":629,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","2048x2048-width":901,"2048x2048-height":629,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java-666x465.png","card_image-width":666,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-qt-to-java.png","wide_image-width":901,"wide_image-height":629}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The primary pieces needed to display the map are as follows:<\/p>\n<p>1. A Qt method that takes in a Java window handle and places the Qt <code>MapView<\/code> on it:<\/p>\n"},{"acf_fc_layout":"content","content":"<pre><code><span style=\"color: #6a737d;\">\/\/ Step 1: Qt method that takes in a JavaFX window handle and displays a MapView<\/span>\r\n<span style=\"color: #d73a49;\">void<\/span> <span style=\"color: #6f42c1;\">QtMapApp::runQtMapOnJavaFxWindow<\/span>(quintptr parentHwnd)\r\n{\r\n    <span style=\"color: #6a737d;\">\/\/ Create the application<\/span>\r\n    QGuiApplication <span style=\"color: #6f42c1;\">app<\/span>(argc, argv);\r\n\r\n    <span style=\"color: #6a737d;\">\/\/ Create QQmlApplicationEngine and load the QML file<\/span>\r\n    QQmlApplicationEngine engine;\r\n\r\n    <span style=\"color: #6a737d;\">\/\/ Set the source<\/span>\r\n    engine.<span style=\"color: #e36209;\">load<\/span>(<span style=\"color: #e36209;\">QUrl<\/span>(<span style=\"color: #032f62;\">\"qrc:\/qml\/main.qml\"<\/span>));\r\n\r\n    <span style=\"color: #6a737d;\">\/\/ Set the foreign window as a parent of the QML root object<\/span>\r\n    QWindow* foreignWindow = QWindow::<span style=\"color: #e36209;\">fromWinId<\/span>(<span style=\"color: #e36209;\">static_cast<\/span>&lt;WId&gt;(parentHwnd));\r\n    <span style=\"color: #d73a49;\">const<\/span> <span style=\"color: #d73a49;\">auto<\/span> rootObjects = engine.<span style=\"color: #e36209;\">rootObjects<\/span>();\r\n    QObject* rootObject = rootObjects.<span style=\"color: #e36209;\">first<\/span>();\r\n    QtMapApp::s_quickWindow = <span style=\"color: #e36209;\">qobject_cast<\/span>&lt;QQuickWindow*&gt;(rootObject);\r\n    <span style=\"color: #d73a49;\">if<\/span> (QtMapApp::s_quickWindow)\r\n    {\r\n        <span style=\"color: #6a737d;\">\/\/ Set the Map as a child of the JavaFx window.<\/span>\r\n        QtMapApp::s_quickWindow-&gt;<span style=\"color: #e36209;\">setParent<\/span>(foreignWindow);\r\n        QtMapApp::s_quickWindow-&gt;<span style=\"color: #e36209;\">setFlags<\/span>(Qt::Window | Qt::FramelessWindowHint);\r\n        QtMapApp::s_quickWindow-&gt;<span style=\"color: #e36209;\">setPosition<\/span>(<span style=\"color: #005cc5;\">200<\/span>, <span style=\"color: #005cc5;\">190<\/span>);\r\n        foreignWindow-&gt;<span style=\"color: #e36209;\">show<\/span>();\r\n        QtMapApp::s_quickWindow-&gt;<span style=\"color: #e36209;\">show<\/span>();\r\n    }\r\n\r\n    app.<span style=\"color: #e36209;\">exec<\/span>();\r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"content","content":"<p>2. A JNI bridge method between Java and Qt:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 2 - Create a JNI bridge method to call from the Java side<\/span>\r\nJNIEXPORT <span style=\"color: #d73a49;\">void<\/span> JNICALL <span style=\"color: #6f42c1;\">Java_com_example_javafxqt_HelloController_runQtMapOnJavaFxWindow<\/span>(JNIEnv *env, jobject obj, jlong parentHwnd)\r\n{\r\n    JniBridge::<span style=\"color: #e36209;\">initialize<\/span>(env, obj);\r\n    QtMapApp::<span style=\"color: #e36209;\">runQtMapOnJavaFxWindow<\/span>(<span style=\"color: #e36209;\">static_cast<\/span>&lt;quintptr&gt;(parentHwnd));\r\n}<\/code><\/pre>\n<p>3. JavaFX code that uses reflection to obtain the window handle from the JavaFX Stage, and ultimately passes this through to the Qt method in step 1 via the JNI Bridge:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 3 - Get the window handle and call the JNI method<\/span>\r\n<span style=\"color: #d73a49;\">void<\/span> <span style=\"color: #6f42c1;\">launchQtApplication<\/span>() {\r\n    Stage stage = (Stage) container.<span style=\"color: #e36209;\">getScene<\/span>().<span style=\"color: #e36209;\">getWindow<\/span>();\r\n    <span style=\"color: #d73a49;\">long<\/span> parentHwnd = <span style=\"color: #e36209;\">getWindowId<\/span>(stage);\r\n    <span style=\"color: #e36209;\">runQtMapOnJavaFxWindow<\/span>(parentHwnd);\r\n}<\/code><\/pre>\n<p>Using this technique, you not only see the map, but you can interact with all the built-in mouse and keyboard gestures, like panning, zooming, and rotating.<\/p>\n<h2 id=\"callmethod\">Calling a Qt method from Java<\/h2>\n<p>Most applications take user input from the UI and pass it to the application logic. To demonstrate this, the example has a JavaFX ComboBox that contains several viewpoint options. When you select a new option, the corresponding <code>setViewpoint<\/code> method is called to programmatically navigate the <code>MapView<\/code>.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2953732,"id":2953732,"title":"map-dropdown-qt-to-java","filename":"map-dropdown-qt-to-java.png","filesize":437557,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\/map-dropdown-qt-to-java","alt":"World map with drop-down menu showing viewpoint options","author":"372342","description":"","caption":"","name":"map-dropdown-qt-to-java","status":"inherit","uploaded_to":2953714,"date":"2026-01-11 08:19:07","modified":"2026-01-11 08:19:57","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":910,"height":622,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","medium-width":382,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","medium_large-width":768,"medium_large-height":525,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","large-width":910,"large-height":622,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","1536x1536-width":910,"1536x1536-height":622,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","2048x2048-width":910,"2048x2048-height":622,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java-680x465.png","card_image-width":680,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-dropdown-qt-to-java.png","wide_image-width":910,"wide_image-height":622}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>We achieved this with the following:<\/p>\n<p>1. Export a JNI method that calls <code>setViewpoint<\/code> on the Qt <code>MapView<\/code>:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 1 - create a JNI method that calls into Qt Maps SDK. This can be called directly from Java.<\/span>\r\nJNIEXPORT <span style=\"color: #d73a49;\">void<\/span> JNICALL <span style=\"color: #6f42c1;\">Java_com_example_javafxqt_HelloController_setViewPoint<\/span>(JNIEnv *env, jobject obj, jdouble x, jdouble y)\r\n{\r\n    <span style=\"color: #d73a49;\">const<\/span> Point <span style=\"color: #6f42c1;\">pt<\/span>(x, y, QtMapApp::s_map-&gt;spatialReference());\r\n    QtMapApp::s_mapView-&gt;<span style=\"color: #e36209;\">setViewpointCenterAsync<\/span>(pt);\r\n}<\/code><\/pre>\n<p>2. Call the JNI method from Java code:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 2 - define the associated method in Java<\/span>\r\n<span style=\"color: #d73a49;\">public<\/span> native <span style=\"color: #d73a49;\">void<\/span> <span style=\"color: #6f42c1;\">setViewPoint<\/span>(<span style=\"color: #d73a49;\">double<\/span> x, <span style=\"color: #d73a49;\">double<\/span> y);\r\n    \r\n<span style=\"color: #6a737d;\">\/\/ Step 3 - call the method in Java when the combo box selection changes<\/span>\r\n<span style=\"color: #e36209;\">setViewPoint<\/span>(<span style=\"color: #005cc5;\">-117.195681<\/span>, <span style=\"color: #005cc5;\">34.056218<\/span>); \/code&gt;<\/code><\/pre>\n<h2 id=\"listen\">Listening to Qt signals (events) in Java with callbacks<\/h2>\n<p>Another important concept for most applications is connecting to events so you can appropriately update your application. For example, events (aka <a href=\"https:\/\/doc.qt.io\/qt-6\/signalsandslots.html#signals\">Qt signals<\/a>) are raised on the Qt side, such as clicking on the <code>MapView<\/code>, and you will need to update the Java side with the clicked location.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2953734,"id":2953734,"title":"map-loc-clicked-qt-to-java","filename":"map-loc-clicked-qt-to-java.png","filesize":733563,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\/map-loc-clicked-qt-to-java","alt":"Location clicked x and y coordinates are now populated","author":"372342","description":"","caption":"The x and y coordinates for Location Clicked are now populated","name":"map-loc-clicked-qt-to-java","status":"inherit","uploaded_to":2953714,"date":"2026-01-11 08:38:53","modified":"2026-01-11 08:40:57","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":905,"height":617,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","medium-width":383,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","medium_large-width":768,"medium_large-height":524,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","large-width":905,"large-height":617,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","1536x1536-width":905,"1536x1536-height":617,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","2048x2048-width":905,"2048x2048-height":617,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java-682x465.png","card_image-width":682,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/map-loc-clicked-qt-to-java.png","wide_image-width":905,"wide_image-height":617}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>We achieved this with the following workflow:<\/p>\n<p>1. Implement a Java method that updates a JavaFX label with the click location:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 1: Declare a Java method that updates a JavaFX label<\/span>\r\n<span style=\"color: #d73a49;\">public<\/span> <span style=\"color: #d73a49;\">void<\/span> <span style=\"color: #6f42c1;\">callJavaFxMethodFromQt<\/span>(<span style=\"color: #d73a49;\">double<\/span> x, <span style=\"color: #d73a49;\">double<\/span> y) {\r\n    xLabel.<span style=\"color: #e36209;\">setText<\/span>(String.<span style=\"color: #e36209;\">valueOf<\/span>(x));\r\n    yLabel.<span style=\"color: #e36209;\">setText<\/span>(String.<span style=\"color: #e36209;\">valueOf<\/span>(y));\r\n}<\/code><\/pre>\n<p>2. Create a thread-safe JNI bridge method:<\/p>\n<pre><code><span style=\"color: #6a737d;\">\/\/ Step 2: Create a JNI bridge method<\/span>\r\ns_helloControllerGlobal = env-&gt;<span style=\"color: #e36209;\">NewGlobalRef<\/span>(helloController);\r\ns_callMethod = env-&gt;<span style=\"color: #e36209;\">GetMethodID<\/span>(cls, <span style=\"color: #032f62;\">\"callJavaFxMethodFromQt\"<\/span>, <span style=\"color: #032f62;\">\"(DD)V\"<\/span>);\r\n\r\n<span style=\"color: #d73a49;\">void<\/span> <span style=\"color: #6f42c1;\">callJavaFxMethodFromQt<\/span>(<span style=\"color: #d73a49;\">double<\/span> x, <span style=\"color: #d73a49;\">double<\/span> y) {    \r\n    JNIEnv* env = <span style=\"color: #005cc5;\">nullptr<\/span>;\r\n    <span style=\"color: #d73a49;\">const<\/span> jint getEnvResult = s_jvm-&gt;<span style=\"color: #e36209;\">GetEnv<\/span>(<span style=\"color: #e36209;\">reinterpret_cast<\/span>&lt;<span style=\"color: #d73a49;\">void<\/span>**&gt;(&amp;env), JNI_VERSION_1_6);\r\n    <span style=\"color: #d73a49;\">bool<\/span> attachedHere = <span style=\"color: #005cc5;\">false<\/span>;\r\n    <span style=\"color: #d73a49;\">if<\/span> (getEnvResult != JNI_OK) {\r\n        <span style=\"color: #d73a49;\">if<\/span> (s_jvm-&gt;<span style=\"color: #e36209;\">AttachCurrentThread<\/span>(<span style=\"color: #e36209;\">reinterpret_cast<\/span>&lt;<span style=\"color: #d73a49;\">void<\/span>**&gt;(&amp;env), <span style=\"color: #005cc5;\">nullptr<\/span>) != JNI_OK) {\r\n            <span style=\"color: #d73a49;\">return<\/span>;\r\n        }\r\n        attachedHere = <span style=\"color: #005cc5;\">true<\/span>;\r\n    }\r\n    \r\n    env-&gt;<span style=\"color: #e36209;\">CallVoidMethod<\/span>(s_helloControllerGlobal, s_callMethod, x, y);\r\n    \r\n    <span style=\"color: #d73a49;\">if<\/span> (attachedHere) {\r\n        s_jvm-&gt;<span style=\"color: #e36209;\">DetachCurrentThread<\/span>();\r\n    }\r\n}<\/code><\/pre>\n<p>3. Connect to the <code>MapView::mouseClicked<\/code> signal in Qt with a lambda function, and call back to Java via the JNI bridge method:<\/p>\n<pre><code><span style=\"color: #e36209;\">connect<\/span>(QtMapApp::s_mapView, &amp;MapQuickView::mouseClicked, <span style=\"color: #d73a49;\">this<\/span>, [](QMouseEvent&amp; mouseEvent)\r\n{\r\n    <span style=\"color: #d73a49;\">const<\/span> <span style=\"color: #d73a49;\">auto<\/span> globalPos = mouseEvent.<span style=\"color: #e36209;\">globalPosition<\/span>();\r\n    <span style=\"color: #d73a49;\">const<\/span> <span style=\"color: #d73a49;\">auto<\/span> localPos = QtMapApp::s_quickWindow-&gt;<span style=\"color: #e36209;\">mapFromGlobal<\/span>(globalPos);\r\n    <span style=\"color: #d73a49;\">const<\/span> <span style=\"color: #d73a49;\">auto<\/span> point = QtMapApp::s_mapView-&gt;<span style=\"color: #e36209;\">screenToLocation<\/span>(localPos.<span style=\"color: #e36209;\">x<\/span>(), localPos.<span style=\"color: #e36209;\">y<\/span>());\r\n    <span style=\"color: #6a737d;\">\/\/ Use JNI bridge for thread-safe callback into Java<\/span>\r\n    JniBridge::<span style=\"color: #e36209;\">callJavaFxMethodFromQt<\/span>(point.<span style=\"color: #e36209;\">x<\/span>(), point.<span style=\"color: #e36209;\">y<\/span>());\r\n});<\/code><\/pre>\n<h2 id=\"req\">What are the software requirements?<\/h2>\n<p>The example <a href=\"https:\/\/github.com\/aji13187\/JavaFxQt\">GitHub repo<\/a> provides all the setup and build instructions. The assumptions are that you are already a JavaFX developer, and that you need to install Qt and the related dependencies, possibly for the first time. Full instructions are available on the <a href=\"https:\/\/developers.arcgis.com\/qt\/get-started\/\">developer site<\/a>, but at a high level, you will minimally need:<\/p>\n<ul>\n<li>The Qt Framework. You can explore whether the open source or commercial license is right for you by reviewing Qt Group\u2019s <a href=\"https:\/\/www.qt.io\/development\/download-open-source\">website<\/a>.<\/li>\n<li>ArcGIS Maps SDK for Qt, version 200.8<\/li>\n<li>Microsoft Visual Studio\u2019s C++ Compiler<\/li>\n<\/ul>\n<h2>Conclusion<\/h2>\n<p>Through the above techniques, we&#8217;ve shown that it is possible to display a Qt MapView in Java, as well as to have two-way communication between Java and Qt via JNI. While this example is by no means a silver bullet, we hope that it might be an inspiration on how you can continue to move forward with your JavaFX apps using the latest ArcGIS technology. We encourage you to clone the <a href=\"https:\/\/github.com\/aji13187\/JavaFxQt\">repo<\/a>, setup your Qt environment and give it a try. If you have any questions, <a href=\"https:\/\/github.com\/aji13187\/JavaFxQt\/issues\/new\">open an issue<\/a>, or reach out on the <a href=\"https:\/\/community.esri.com\/t5\/qt-maps-sdk-questions\/bd-p\/arcgis-runtime-sdk-for-qt-questions\">Esri Community forums<\/a>.<\/p>\n<style>ul.spaced>li,ul.spaced>li ul li{margin-top:.5rem;line-height: 28px;} ul.spaced li ul{padding-bottom:0 !important}<\/style>\n<style>details div{background-color: #efefef; padding: 1rem 1rem 0 1rem; border: 1px solid #ccc; margin-top: 0; margin-bottom: 1rem;}<\/style>\n<style>summary{margin-bottom: 1rem;cursor:pointer}<\/style>\n<style>details ul li ul{margin-top: 1rem; padding-bottom: 0.5rem;}<\/style>\n<style>details[open] summary span:before{content: \"\u2296 \"}<\/style>\n<style>details summary span:before{content: \"\u2295 \"}small, .small, .note{font-size: 1.1rem; border: 1px dotted #ccc; padding: .6rem; display: block; background-color: #fdfdfd;} ul.spaced ul{display:block !important; } ul.spaced ul li:last-child{padding-bottom:0rem}} details ul.spaced ul{padding-top: 0 !important;}h3{margin-bottom: 0;}.mb0{margin-bottom:0 !important}.pb0{padding-bottom:0 !important}.mb1{margin-bottom:1rem}div.note{margin-bottom: 1rem; line-height: 1.8rem;}ol li{margin-bottom:1rem}<\/style>\n"}],"related_articles":[{"ID":2255312,"post_author":"5171","post_date":"2024-03-06 16:40:27","post_date_gmt":"2024-03-07 00:40:27","post_content":"","post_title":"Announcing the Deprecation of ArcGIS Maps SDK for Java","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"announcing-the-deprecation-of-arcgis-maps-sdk-for-java","to_ping":"","pinged":"","post_modified":"2024-03-08 15:54:11","post_modified_gmt":"2024-03-08 23:54:11","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2255312","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/01\/qt-javafx-card.png","wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using ArcGIS Maps SDK for Qt in a JavaFX based application<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using ArcGIS Maps SDK for Qt in a JavaFX based application\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-24T19:27:02+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\"},\"author\":{\"name\":\"Mara Dolan\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5791f5a81b39ed41c76c2f7e9f7da6bd\"},\"headline\":\"Using ArcGIS Maps SDK for Qt in a JavaFX based application\",\"datePublished\":\"2026-01-13T18:00:07+00:00\",\"dateModified\":\"2026-03-24T19:27:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\"},\"wordCount\":11,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"articleSection\":[\"Developers\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\",\"name\":\"Using ArcGIS Maps SDK for Qt in a JavaFX based application\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2026-01-13T18:00:07+00:00\",\"dateModified\":\"2026-03-24T19:27:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using ArcGIS Maps SDK for Qt in a JavaFX based application\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5791f5a81b39ed41c76c2f7e9f7da6bd\",\"name\":\"Mara Dolan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/12\/myphoto-e1765182771432-213x200.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/12\/myphoto-e1765182771432-213x200.jpg\",\"caption\":\"Mara Dolan\"},\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/mdolan\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Using ArcGIS Maps SDK for Qt in a JavaFX based application","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","og_locale":"en_US","og_type":"article","og_title":"Using ArcGIS Maps SDK for Qt in a JavaFX based application","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2026-03-24T19:27:02+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application"},"author":{"name":"Mara Dolan","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5791f5a81b39ed41c76c2f7e9f7da6bd"},"headline":"Using ArcGIS Maps SDK for Qt in a JavaFX based application","datePublished":"2026-01-13T18:00:07+00:00","dateModified":"2026-03-24T19:27:02+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application"},"wordCount":11,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"articleSection":["Developers"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application","name":"Using ArcGIS Maps SDK for Qt in a JavaFX based application","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2026-01-13T18:00:07+00:00","dateModified":"2026-03-24T19:27:02+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-java\/developers\/using-arcgis-maps-sdk-for-qt-in-a-javafx-based-application#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Using ArcGIS Maps SDK for Qt in a JavaFX based application"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/5791f5a81b39ed41c76c2f7e9f7da6bd","name":"Mara Dolan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/12\/myphoto-e1765182771432-213x200.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/12\/myphoto-e1765182771432-213x200.jpg","caption":"Mara Dolan"},"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/mdolan"}]}},"text_date":"January 13, 2026","author_name":"Lucas Danzinger","author_page":"https:\/\/www.esri.com\/arcgis-blog\/author\/ldanzinger","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Maps SDK for Java","tag_data":[],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":420,"filter":"raw"}],"product_data":[{"term_id":769162,"name":"ArcGIS Maps SDK for Java","slug":"sdk-java","term_group":0,"term_taxonomy_id":769162,"taxonomy":"product","description":"","parent":36601,"count":24,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=sdk-java","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2953714","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/372342"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2953714"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2953714\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2953714"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2953714"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2953714"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2953714"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2953714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}