| We will introduce basic image handling here and discuss this and 
              other aspects of images in Java in greater detail in Chapter 
              11.  For basic image operations you deal with images as instances of 
              the class  
               java.awt.Image (In Chapter 11 we will discuss 
              the more capable BufferedImage 
              subclass of Image.) As of Java 1.4 you can load and draw image files encoded as JPEG, 
              GIF and PNG. With Java 5.0 you can also load bitmap formats BMP 
              and WBMP.   To load an image in an applet, you can use one of the overloaded 
              getImage() 
              methods for loading from a URL:   Image 
              img = getImage("http://www.myschool.edu/anImage.gif"); or :   Image 
              img = getImage(getCodeBase(),"anImage.gif");  where the Applet 
              class method getCodeBase() 
              provides the URL for the location of the applet's class file. The 
              file name in the second argument is appended to this URL. (See Chapter 
              13 for information about the java.net.URL 
              class.)  For an application, use   Image 
              img = Toolkit.getDefaultToolkit().getImage(URL or file path); 
                The Toolkit 
              is a class in the java.awt 
              package that provides various resources and tools for the display 
              system. One of the Toolkit 
              methods is getImage() 
              that functions much like the getImage() 
              method in the Applet 
              class. It is overloaded to take either a String 
              filename parameter specifying the location of the image file or 
              a URL parameter identifying the image file.  Before calling getImage(), 
              one must have a reference to the Toolkit 
              instance in use. The static method Toolkit.getDefaultToolkit() 
              returns a reference to that Toolkit.  You can obtain an image from 
              a JAR file by using the getResource() 
              static method from the Class 
              class:    URL 
              url = this.getClass().getResource("anImage.gif"); Image img = Toolkit.getDefaultToolkit().getImage(url);
 or 
                 URL 
              url = YourClass.class.getResource("anImage.gif"); Image img = Toolkit.getDefaultToolkit().getImage(url);
 Note: Image 
              is an abstract class so you are actually loading an instance of 
              a concrete subclass of Image 
              with the getImage() 
              methods above. However, you always treat the object as an instance 
              of Image, 
              i.e. you only have access to its methods. Drawing Images To draw an image, use the drawImage() 
              method in the Graphics 
              context:    g.drawImage(img, 
              x, y, this); Here, img 
              is a reference to an instance of Image, 
              x and y are the coordinates of the position of the top left corner 
              of the image. The third argument is an ImageObserver 
              reference, which is used internally as a callback to inform a program 
              about the status of the image loading. The Component 
              class implements the ImageObserver 
              interface so you can just put a "this" 
              reference for the argument as default. We discuss image loading 
              below and in Chapter 11. The following applet demonstrates the essentials of 
              obtaining an image, obtaining its dimensions, and displaying it 
              on a JPanel. 
              
              
                 
                  |  |   
                  | import 
                      javax.swing.*;import java.awt.*;
 
 /** Demonstrate drawing an image. 
                      **/
 public 
                      class 
                      ImageApplet extends 
                      JApplet
 {
 public void init 
                      () {
 Container 
                      content_pane = getContentPane 
                      ();
 
      // 
                      Grab the image. Image img = getImage (getCodeBase 
                      (), "liftoff.jpg");
     
                      // Create an instanceof DrawingPanelDrawingPanel drawing_panel =  new 
                      DrawingPanel (img);
     
                      // Add the DrawingPanel to the content 
                      pane. content_pane.add 
                      (drawing_panel);
 } // 
                      init
 
 } // class ImageApplet
 
 class 
                      DrawingPanel extends 
                      JPanel
 {
 Image img;
 
 DrawingPanel (Image 
                      img)
 { this.img = img; 
                      }
 
 public void paintComponent 
                      (Graphics g) {
 super.paintComponent (g);
 
 // 
                      Use the image width & height to find the starting point
 int imgX 
                      = getSize ().width/2 - img.getWidth 
                      (this);
 int imgY 
                      = getSize ().height/2 
                      - img.getHeight 
                      (this);
 
 //Draw image centered 
                      in the middle of the panel
 g.drawImage (img, 
                      imgX, imgY, this);
 } // 
                      paintComponent
 
 } 
                      // DrawingPanel
 |    Image Loading The tricky part about images in Java is that they 
              may not load instantly. The getImage() 
              method returns immediately after it is invoked so that a program 
              does not hang while waiting for an image to download over a potentially 
              slow Internet line. The image loading, in fact, does not even begin 
              until the program attempts to access (e.g. obtain the dimensions 
              of the image) or to draw the image.  This usually does not present a problem when loading 
              one or two small or medium sized images but could become a problem 
              when loading several large images or many images, as in the case 
              of an animation, over a slow link. There are several techniques to monitor the image 
              loading and signal when it is fully ready. We will discuss these 
              more in Chapter 11: Java 
              : Image Loading. We only note here that in the above example, 
              the 
              getWidth(), getHeight(), 
              and drawImage() 
              methods required an ImageObserver 
              argument reference. The image loading machinery uses this reference 
              to "callback" via the imageUpdate() 
              method of the ImageObserver 
              interface. The callbacks occur periodically during the loading 
              and provide information about the status of the loading.  The Component 
              class implements the ImageObserver 
              interface and overrides the imageUpdate() 
              method. (The "this" 
              references in the above example points to the JPanel 
              object.) You can override this method yourself to monitor the image 
              loading but usually a MediaTracker 
              object, which we will discuss in Chapter 
              11: Java : Image Loading, provides a simpler approach.  References & Web Resources Latest update: Nov 8, 2006 |