Hi,

not sure this is OS X specific, but I encountered a curious little issue with 
1.8.0u20.
Every now and then, MediaTracking of an ImageIcon does not seem to work all the 
way.

Here's what I expect:

A call to:

IconImage icon = new ImageIcon(someHttpURL);

will load the image via HTTP and only return once the image has been completely 
loaded.
When that happens, icon.getIconWidth() will return the image's width.
It will be the same as icon.getImage().getWidth(null).

This, I tested, is true for Java 1.8.0.


This is what I observe:

On 1.8.0u20, every now and then, 
icon.getIconWidth() returns -1, even though the URL is clearly valid.
icon.getImage().getWidth(null) also return -1.

However, after waiting a little while, 
icon.getIconWidth() still returns -1 and
icon.getImage().getWidth(null) returns the true width

So it seems to me, that the MediaTracker used in ImageIcon, does not wait until 
the image is fully loaded.
In fact, it returns a status 10 (aborted). And even when the image is fully 
loaded, it never updated its iconWidth.


The problem can be reproduced reliably with the code below. I filed a bug - 
Review id JI-9011717.

Cheers,

-hendrik


import javax.swing.*;
import java.net.MalformedURLException;
import java.net.URL;

public class IconImageTest {
    public static void main(String[] args) throws MalformedURLException {

        final URL[] urls = new URL[70];

        urls[0] = new 
URL("http://ecx.images-amazon.com/images/I/414h77wL4EL._SL160_.jpg";);
        urls[1] = new 
URL("http://ecx.images-amazon.com/images/I/515pogBxO9L._SL160_.jpg";);
        urls[2] = new 
URL("http://ecx.images-amazon.com/images/I/41I1vwgqsXL._SL160_.jpg";);
        urls[3] = new 
URL("http://ecx.images-amazon.com/images/I/51-JzKwWe-L._SL160_.jpg";);
        urls[4] = new 
URL("http://ecx.images-amazon.com/images/I/51V5n3XX4sL._SL160_.jpg";);
        urls[5] = new 
URL("http://ecx.images-amazon.com/images/I/610zMH8VYyL._SL160_.jpg";);
        urls[6] = new 
URL("http://ecx.images-amazon.com/images/I/51pmAKfwTlL._SL160_.jpg";);
        urls[7] = new 
URL("http://ecx.images-amazon.com/images/I/61vHzDEgxgL._SL160_.jpg";);
        urls[8] = new 
URL("http://ecx.images-amazon.com/images/I/51TAPDNMBdL._SL160_.jpg";);
        urls[9] = new 
URL("http://ecx.images-amazon.com/images/I/51ZuY7zfsfL._SL160_.jpg";);
        urls[10] = new 
URL("http://ecx.images-amazon.com/images/I/41Upfpq4XnL._SL160_.jpg";);
        urls[11] = new 
URL("http://ecx.images-amazon.com/images/I/51zSTVJM6nL._SL160_.jpg";);
        urls[12] = new 
URL("http://ecx.images-amazon.com/images/I/51-6wmW4swL._SL160_.jpg";);
        urls[13] = new 
URL("http://ecx.images-amazon.com/images/I/51gmuw5qUrL._SL160_.jpg";);
        urls[14] = new 
URL("http://ecx.images-amazon.com/images/I/41NYyfjNZjL._SL160_.jpg";);
        urls[15] = new 
URL("http://ecx.images-amazon.com/images/I/51RNerVHKRL._SL160_.jpg";);
        urls[16] = new 
URL("http://ecx.images-amazon.com/images/I/51KpoPP738L._SL160_.jpg";);
        urls[17] = new 
URL("http://ecx.images-amazon.com/images/I/61iKyNi5UKL._SL160_.jpg";);
        urls[18] = new 
URL("http://ecx.images-amazon.com/images/I/61iGFtl2YmL._SL160_.jpg";);
        urls[19] = new 
URL("http://ecx.images-amazon.com/images/I/41fos%2BEksdL._SL160_.jpg";);
        urls[20] = new 
URL("http://ecx.images-amazon.com/images/I/51RpKf9APDL._SL160_.jpg";);
        urls[21] = new 
URL("http://ecx.images-amazon.com/images/I/61e21Jz2yiL._SL160_.jpg";);
        urls[22] = new 
URL("http://ecx.images-amazon.com/images/I/51AmYeBsMCL._SL160_.jpg";);
        urls[23] = new 
URL("http://ecx.images-amazon.com/images/I/61aETwYg8PL._SL160_.jpg";);
        urls[24] = new 
URL("http://ecx.images-amazon.com/images/I/61m5%2BVAZrrL._SL160_.jpg";);
        urls[25] = new 
URL("http://ecx.images-amazon.com/images/I/51nA1JIuRNL._SL160_.jpg";);
        urls[26] = new 
URL("http://ecx.images-amazon.com/images/I/41GRH80LYeL._SL160_.jpg";);
        urls[27] = new 
URL("http://ecx.images-amazon.com/images/I/41IhcL9HZkL._SL160_.jpg";);
        urls[28] = new 
URL("http://ecx.images-amazon.com/images/I/51k-Q52GnFL._SL160_.jpg";);
        urls[29] = new 
URL("http://ecx.images-amazon.com/images/I/51SQ3BkujSL._SL160_.jpg";);
        urls[30] = new 
URL("http://ecx.images-amazon.com/images/I/41iJNnii-ZL._SL160_.jpg";);
        urls[31] = new 
URL("http://ecx.images-amazon.com/images/I/41etRDeiMoL._SL160_.jpg";);
        urls[32] = new 
URL("http://ecx.images-amazon.com/images/I/51tr3o4kd9L._SL160_.jpg";);
        urls[33] = new 
URL("http://ecx.images-amazon.com/images/I/5128-LvpmZL._SL160_.jpg";);
        urls[34] = new 
URL("http://ecx.images-amazon.com/images/I/51leTIgrqWL._SL160_.jpg";);
        urls[35] = new 
URL("http://ecx.images-amazon.com/images/I/41RpWVBJz6L._SL160_.jpg";);
        urls[36] = new 
URL("http://ecx.images-amazon.com/images/I/51VjeYTFzOL._SL160_.jpg";);
        urls[37] = new 
URL("http://ecx.images-amazon.com/images/I/61VQl%2B0YfQL._SL160_.jpg";);
        urls[38] = new 
URL("http://ecx.images-amazon.com/images/I/41mJt4IVkhL._SL160_.jpg";);
        urls[39] = new 
URL("http://ecx.images-amazon.com/images/I/417ZNQ5C1FL._SL160_.jpg";);
        urls[40] = new 
URL("http://ecx.images-amazon.com/images/I/511zXx9fdCL._SL160_.jpg";);
        urls[41] = new 
URL("http://ecx.images-amazon.com/images/I/61OycahzgyL._SL160_.jpg";);
        urls[42] = new 
URL("http://ecx.images-amazon.com/images/I/51eCZAq37qL._SL160_.jpg";);
        urls[43] = new 
URL("http://ecx.images-amazon.com/images/I/5113GxfgY3L._SL160_.jpg";);
        urls[44] = new 
URL("http://ecx.images-amazon.com/images/I/61xnT6WcaEL._SL160_.jpg";);
        urls[45] = new 
URL("http://ecx.images-amazon.com/images/I/51QWxgU9N2L._SL160_.jpg";);
        urls[46] = new 
URL("http://ecx.images-amazon.com/images/I/5149PFGq8rL._SL160_.jpg";);
        urls[47] = new 
URL("http://ecx.images-amazon.com/images/I/617W9ZTJGBL._SL160_.jpg";);
        urls[48] = new 
URL("http://ecx.images-amazon.com/images/I/513JTvJWpFL._SL160_.jpg";);
        urls[49] = new 
URL("http://ecx.images-amazon.com/images/I/6114I6QC7BL._SL160_.jpg";);
        urls[50] = new 
URL("http://ecx.images-amazon.com/images/I/216QZM5FJ8L._SL160_.jpg";);
        urls[51] = new 
URL("http://ecx.images-amazon.com/images/I/413WE38pDRL._SL160_.jpg";);
        urls[52] = new 
URL("http://ecx.images-amazon.com/images/I/51LSN2zSeAL._SL160_.jpg";);
        urls[53] = new 
URL("http://ecx.images-amazon.com/images/I/51PzHVqOMwL._SL160_.jpg";);
        urls[54] = new 
URL("http://ecx.images-amazon.com/images/I/61GWhfvALPL._SL160_.jpg";);
        urls[55] = new 
URL("http://ecx.images-amazon.com/images/I/41C5ZXEZwrL._SL160_.jpg";);
        urls[56] = new 
URL("http://ecx.images-amazon.com/images/I/61teoR6B8JL._SL160_.jpg";);
        urls[57] = new 
URL("http://ecx.images-amazon.com/images/I/51rnHibCn2L._SL160_.jpg";);
        urls[58] = new 
URL("http://ecx.images-amazon.com/images/I/511aIQsGmhL._SL160_.jpg";);
        urls[59] = new 
URL("http://ecx.images-amazon.com/images/I/51YgnRCFdOL._SL160_.jpg";);
        urls[60] = new 
URL("http://ecx.images-amazon.com/images/I/51uAqL4pA4L._SL160_.jpg";);
        urls[61] = new 
URL("http://ecx.images-amazon.com/images/I/514FnLMr5vL._SL160_.jpg";);
        urls[62] = new 
URL("http://ecx.images-amazon.com/images/I/51NoPs4muzL._SL160_.jpg";);
        urls[63] = new 
URL("http://ecx.images-amazon.com/images/I/515ndTGE9kL._SL160_.jpg";);
        urls[64] = new 
URL("http://ecx.images-amazon.com/images/I/61XRtZ08c6L._SL160_.jpg";);
        urls[65] = new 
URL("http://ecx.images-amazon.com/images/I/61kDVs82oRL._SL160_.jpg";);
        urls[66] = new 
URL("http://ecx.images-amazon.com/images/I/61p85bjPV%2BL._SL160_.jpg";);
        urls[67] = new 
URL("http://ecx.images-amazon.com/images/I/41JDQF9F5ML._SL160_.jpg";);
        urls[68] = new 
URL("http://ecx.images-amazon.com/images/I/51ZqPCspJeL._SL160_.jpg";);
        urls[69] = new 
URL("http://ecx.images-amazon.com/images/I/51cMFdhLFSL._SL160_.jpg";);

        final ImageIcon[] icons = new ImageIcon[70];
        for (int i=0; i<urls.length; i++) {
            icons[i] = new ImageIcon(urls[i]);
            System.out.println("iconWidth=" + icons[i].getIconWidth() + ", 
image.width=" + icons[i].getImage().getWidth(null) + " imageLoadStatus=" + 
icons[i].getImageLoadStatus());
            i++;
        }

        System.out.println("Wait a little....");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (int i=0; i<urls.length; i++) {
            final int iconWidth = icons[i].getIconWidth();
            final int width = icons[i].getImage().getWidth(null);
            System.out.print("iconWidth=" + iconWidth + ", image.width=" + 
width);
            if (iconWidth != width) System.out.println("   ***** icon width is 
not correct *****");
            else System.out.println();
            i++;
        }

    }
}

Reply via email to