commit 82e763f51c86dacbbea890962ece8804cd6f489b
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   2020-03-16 20:24:03 +0100

    fix #18941 - MapImage.getImageResource: wait for image to load

diff --git a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
index aef68a6fa..238254cb6 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/styleelement/MapImage.java
@@ -9,6 +9,8 @@
 import java.awt.Rectangle;
 import java.awt.image.BufferedImage;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 
 import javax.swing.ImageIcon;
 
@@ -21,6 +23,7 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.ImageResource;
+import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -114,9 +117,19 @@ public Image getImage(boolean disabled) {
 
     /**
      * Get the image resource associated with this MapImage object.
+     * This method blocks until the image has been loaded.
      * @return the image resource
      */
     public ImageResource getImageResource() {
+        if (imageResource == null) {
+            try {
+                // load and wait for the image
+                loadImage().get();
+            } catch (ExecutionException | InterruptedException e) {
+                Logging.warn(e);
+                Thread.currentThread().interrupt();
+            }
+        }
         return imageResource;
     }
 
@@ -141,7 +154,18 @@ private Image getImage() {
         if (img != null)
             return img;
         temporary = false;
-        new ImageProvider(name)
+        loadImage();
+        synchronized (this) {
+            if (img == null) {
+                img = ImageProvider.get("clock").getImage();
+                temporary = true;
+            }
+        }
+        return img;
+    }
+
+    private CompletableFuture<Void> loadImage() {
+        return new ImageProvider(name)
                 .setDirs(MapPaintStyles.getIconSourceDirs(source))
                 .setId("mappaint."+source.getPrefName())
                 .setArchive(source.zipIcons)
@@ -167,13 +191,6 @@ private Image getImage() {
                     }
                 }
         );
-        synchronized (this) {
-            if (img == null) {
-                img = ImageProvider.get("clock").getImage();
-                temporary = true;
-            }
-        }
-        return img;
     }
 
     /**
