Index: swing/src/main/java/common/javax/swing/text/html/BackgroundImageLoader.java =================================================================== --- swing/src/main/java/common/javax/swing/text/html/BackgroundImageLoader.java (revision 562071) +++ swing/src/main/java/common/javax/swing/text/html/BackgroundImageLoader.java (working copy) @@ -40,16 +40,26 @@ private volatile boolean ready; private volatile boolean error; - BackgroundImageLoader(final URL url, + private boolean synchronous; + Object lock = new Object(); + + final Toolkit tk = Toolkit.getDefaultToolkit(); + + BackgroundImageLoader(final URL url, boolean synchronous, final int desiredWidth, final int desiredHeight) { this.desiredWidth = desiredWidth; this.desiredHeight = desiredHeight; + this.synchronous = synchronous; + error = url == null; if (!error) { - final Toolkit tk = Toolkit.getDefaultToolkit(); image = tk.createImage(url); - tk.prepareImage(image, desiredWidth, desiredHeight, this); + if (synchronous){ + waitForImage(); + } else { + tk.prepareImage(image, desiredWidth, desiredHeight, this); + } } else { image = null; } @@ -64,16 +74,22 @@ if ((flags & HEIGHT) != 0) { imageHeight = desiredHeight == -1 ? height : desiredHeight; } - if ((flags & ALLBITS) != 0) { + if ((flags & (FRAMEBITS | ALLBITS)) != 0) { ready = true; onReady(); } if ((flags & (ERROR | ABORT)) != 0) { error = true; onError(); - return false; } - return width == -1 || height == -1 || !ready; + + if (synchronous){ + synchronized (lock){ + lock.notify(); + } + } + + return (flags & ALLBITS) == 0; } public final Image getImage() { @@ -97,11 +113,15 @@ } public final void waitForImage() { - while (!ready && !error) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - e.printStackTrace(); + synchronized (lock){ + if (!tk.prepareImage(image, desiredWidth, desiredHeight, this)) { + while (!(error | ready)) { + try { + lock.wait(1000); + } catch(InterruptedException e) { + Thread.currentThread().interrupt(); + } + } } } } Index: swing/src/main/java/common/javax/swing/text/html/ImageView.java =================================================================== --- swing/src/main/java/common/javax/swing/text/html/ImageView.java (revision 562071) +++ swing/src/main/java/common/javax/swing/text/html/ImageView.java (working copy) @@ -53,9 +53,9 @@ private BackgroundImageLoader loader; private String src; - private URL imageURL; - private boolean synchronous; + //TODO We can load images only synchronously yet + private boolean synchronous = true; private Color color; @@ -67,15 +67,12 @@ } public Image getImage() { - return loader.image; + return loader.getImage(); } public URL getImageURL() { - if (imageURL == null) { - URL base = ((HTMLDocument)getDocument()).getBase(); - imageURL = HTML.resolveURL(src, base); - } - return imageURL; + URL base = ((HTMLDocument)getDocument()).getBase(); + return HTML.resolveURL(src, base); } public Icon getLoadingImageIcon() { @@ -167,10 +164,8 @@ if (!loader.isReady()) { if (!synchronous) { getLoadingImageIcon().paintIcon(null, g, rc.x, rc.y); - } else { - loader.waitForImage(); + return; } - return; } g.drawImage(getImage(), rc.x, rc.y, rc.width, rc.height, loader); @@ -242,8 +237,7 @@ } private void createImage(final int desiredWidth, final int desiredHeight) { - imageURL = null; - loader = new BackgroundImageLoader(getImageURL(), + loader = new BackgroundImageLoader(getImageURL(), synchronous, desiredWidth, desiredHeight) { protected void onReady() { super.onReady();