2 Replies Latest reply: Aug 12, 2010 6:21 AM by 796280 RSS

    Image object getWidth() and getHeight() returning -1

    796280
      Hello all,

      I'm currently unit testing a pretty simple utility that calculates a new image position, given a handful of parameters (including image width and height).

      The problem I'm running into is this:
      The image width/height don't always load immediately. My only clue so far from searching the web is this:
      http://download-llnw.oracle.com/javase/6/docs/api/java/awt/Image.html#getWidth%28java.awt.image.ImageObserver%29
      which states
      Determines the width of the image. If the width is not yet known, this method returns -1 and the specified ImageObserver object is notified later. 
      In my JUnit test harness, I have the following code to load my images, using Toolkit:
      public static final String TEST_IMG_1_PATH = "images/apple_logo.png";
      public static final String TEST_IMG_2_PATH = "images/dude.png";
      private Image testImage1, testImage2;
           
      @Before
      public void setUp() throws Exception {
           testImage1 = Toolkit.getDefaultToolkit().getImage(TEST_IMG_1_PATH);
           testImage2 = Toolkit.getDefaultToolkit().getImage(TEST_IMG_2_PATH);
           
           // check the image size to see if they are fully loaded:
           System.out.println(testImage1.getWidth(null));
           System.out.println(testImage1.getHeight(null));
           System.out.println(testImage2.getWidth(null));
           System.out.println(testImage2.getHeight(null));
      }
      Because the utility method I'm testing heavily depends on the image size, my tests intermittently fail. When I run this, I typically get -1 for all of the image dimension checks (see the above println()s).
      -1
      -1
      -1
      -1
      Even with these "-1" results, my test still passes... which means at some point before the test assert() statement executes, the images do become fully loaded.

      My question is: What can I do to make sure my image is loaded fully before I do anything with it? Is there any elegant way to handle this? Am I doing something wrong?

      Thanks for your time.
      -Thok