SDSU CS 596 Java Programming
Fall Semester, 1998
Some Graphics
To Lecture Notes Index
© 1998, All Rights Reserved, SDSU & Roger Whitney
San Diego State University -- This page last updated 21-Dec-98

Contents of Doc 25, Some Graphics


References:


Graphic Java 1.2 Volume I: AWT 3 rd Edition, Geary, Chapter 3 (pp. 27-67 )

Core Java Volume 1 - Fundamentals , Prentice Hall, Horstmann & Cornell, 1997, pp. 279-288

Java in a Nutshell , 2 nd Ed. Flanagan, O'Reilly, 1997, pp. 161-162

Listen Here!S-nov23 1min Doc 25, Some Graphics Slide # 2

Graphics


The paint method has a graphics object as an argument

   public  void  paint(  Graphics  display  )  {
      display.drawString(  "Constant" , 30, 40  );
   }

The graphics class contains methods for drawing

Some Graphics Methods
clearRect(int, int, int, int) drawString(String, int, int)
clipRect(int, int, int, int) fill3DRect(int, int, int, int, boolean)
copyArea(int, int, int, int, int, int) fillArc(int, int, int, int, int, int)
create() fillOval(int, int, int, int)
create(int, int, int, int) fillPolygon(int[], int[], int)
dispose() fillPolygon(Polygon)
draw3DRect(int, int, int, int, boolean) fillRect(int, int, int, int)
drawArc(int, int, int, int, int, int) fillRoundRect(int, int, int, int, int, int)
drawBytes(byte[], int, int, int, int) finalize()
drawChars(char[], int, int, int, int) getClipRect()
drawImage(Image, int, int, Color, ImageObserver) getColor()
drawImage(Image, int, int, ImageObserver) getFont()
drawImage(Image, int, int, int, int, Color, ImageObserver) getFontMetrics()
drawImage(Image, int, int, int, int, ImageObserver) getFontMetrics(Font)
drawLine(int, int, int, int) setColor(Color)
drawOval(int, int, int, int) setFont(Font)
drawPolygon(int[], int[], int) setPaintMode()
drawPolygon(Polygon) setXORMode(Color)
drawRect(int, int, int, int) toString()
drawRoundRect(int, int, int, int, int, int) translate(int, int)


Listen Here!Q-nov19 2mins, S-nov23 6mins Doc 25, Some Graphics Slide # 3

Drawing

This example shows some methods in Graphics that we can use to draw on the screen.
import  java.awt.*;
class  Drawing  extends  Frame {
   public  Drawing  ( int  WidthInPixels, int heightInPixels ) {
      setTitle( "Drawing" );
      setSize( WidthInPixels, heightInPixels );
      setLocation( 40, 40);
      setBackground( Color.green);
      show();
   }
   public  void  paint(  Graphics  display  )  {
      display.setColor( Color.darkGray );
      int x = 50;         int y = 30;
      int width = 40;      int height =  40;
      display.drawOval(  x,  y,  width,  height  );
      x = 100;
      display.drawRect(  x,  y,  width,  height  );
      x = 150;
      display.fillRect(  x,  y,  width,  height  );
      x = 200;
      boolean  raised = true;
      display.draw3DRect(  x,  y,  width,  height,  raised  );
      
      display.setColor( Color.red );
      int x1 = 50;  int y1 =  60;
      int x2 = 200; int y2 = 60;
      display.drawLine( x1, y1, x2, y2 );
      Dimension size = getSize();
      display.drawRect( 0, 0, size.width - 1, size.height -1 );
   }
   public  static  void  main( String  args[] ){
      new  Drawing( 300,  100 );
   }
}

Doc 25, Some Graphics Slide # 4
Output


Listen Here!Q-nov19 2mins, S-nov23 6mins Doc 25, Some Graphics Slide # 5

Drawing Modes


Normal paint mode is to cover bits as you draw. In normal draw mode, drawing a red line on a red area has no effect. In XOR mode, colors are toggled. There is a current drawing color and an XOR color. If you draw over an area that is already in the current drawing color, the XOR color is used. If you draw over an area that is not the current drawing color, then you will get an unpredictable but reversible color: draw twice and the pixels revert back to original values. Change to XOR mode with Graphics method: setXORMode( Color XORColor ). Change to paint mode with Graphics method setPaintMode().
class  XORMode  extends  Frame {
   public  XORMode  ( int  WidthInPixels, int heightInPixels ) {
      setTitle( "XORMode" );
      setSize( WidthInPixels, heightInPixels );
      setLocation( 40, 40);
      setBackground( Color.white);
      show();
   }
   public  void  paint(  Graphics  display  )  {
      display.setColor( Color.darkGray );
      int x = 10;         int y = 10;
      int width = 40;      int height =  40;
      int shift = width/2;
      display.fillRect(  x,  y,  width,  height  );
      display.fillRect(  x + shift,  y + shift,  width,  height  );
      display.setXORMode( Color.green );
      display.fillRect(  x + 2*shift,  y + 2*shift,  width,  height  );
      display.fillRect(  x + 3*shift,  y + 3*shift,  width,  height  );
      display.fillRect(  x + 4*shift,  y + 4*shift,  width,  height  );
      display.fillRect(  x + 4*shift,  y + 4*shift,  width,  height  );
      
      display.setPaintMode();
   }
   public  static  void  main( String  args[] ){
      new  XORMode( 150,  150 );
   }
}

Doc 25, Some Graphics Slide # 6
XORMode Output

Listen Here!Q-nov19 1min, S-nov23 3mins Doc 25, Some Graphics Slide # 7

Clipping

A clipping area restricts the area in which drawing is done. This is useful when updating just part of the drawing area. You can draw in the rest of the drawing area, but it will not have any effect.
import java.awt.*;

class  Clipping  extends  Frame {
   public  Clipping  ( int  WidthInPixels, int heightInPixels ) {
      setTitle( "Clipping" );
      setSize( WidthInPixels, heightInPixels );
      setLocation( 40, 40);
      setBackground( Color.white);
      show();
   }
   public  void  paint(  Graphics  display  )  {
      display.setColor( Color.darkGray );
      int x = 10;         int y = 10;
      int width = 130;      int height =  40;
      display.fillRect(  x,  y,  width,  height  );
      
      int clipX = 60;      int clipY = 60;
      int clipWidth = 30;   int clipHeight = 40;
      display.setClip(clipX, clipY, clipWidth, clipHeight);
      display.fillRect(  x ,  y + 60,  width,  height  );
   }
   public  static  void  main( String  args[] ){
      new  Clipping( 150,  100 );
   }
}
Output

Listen Here!Q-nov19 3mins, S-nov23 5mins Doc 25, Some Graphics Slide # 8

Printing (JDK 1.1)

This example shows how to print using the JDK 1.1. Printing in JDK 1.2 has been changed some what. The steps to print.
First, get a PrintJob object using: getToolkit().getPrintJob( theFrameToPrint, "Job Title", aPropertiesObject ); where getToolKit() is a method in Frame's parent class. The first argument is the frame to print. The second argument is the name of the print job. The third argument is a properties object. The preferences the user sets in the print dialog are stored in the properties. If you pass the properties object to the print job a second time, the user's settings are used in the print dialog. (This does not work with the Apple MRJ 2.1 early access 2 JVM.)

Second, get a graphics object from the print job and draw on it.
Third, call dispose on the graphics to "eject the page from the printer".
Fourth, repeat the second and third steps for other pages.
Fifth, call end() on the print job to end it.
class  Printing  extends  Frame {
   class PrintListener implements ActionListener {
      
      public void actionPerformed( ActionEvent event )  {
      PrintJob myPrint = 
         getToolkit().getPrintJob( Printing.this, "Sample Print", null );
      if ( myPrint == null ) 
         return;
      
      Graphics printGraphics = myPrint.getGraphics();
      if ( printGraphics == null ) 
         return;
      
      Printing.this.paint(    printGraphics );
      printGraphics.dispose(); //flush page
      myPrint.end();
      }
   }
   public  Printing  ( int  WidthInPixels, int heightInPixels ) {
      setTitle( "Printing" );
      setSize( WidthInPixels, heightInPixels );
      setLocation( 40, 40);
      setBackground( Color.white);
      setLayout( new FlowLayout() );      
      Button print = new Button( "Print" );    
      
      add( print );
      print.addActionListener( new PrintListener() );
      show();
   }

Listen Here!S-nov23 4mins Doc 25, Some Graphics Slide # 9
Printing Continued
   public  void  paint(  Graphics  display  )  {
      int x = 10;         int y = 50;
      int width = 20;      int height =  20;
      display.fillRect(  x,  y,  width,  height  );
      display.drawString( "Hi Mom", 40, y );
   }
   public  static  void  main( String  args[] ){
      new  Printing( 150,  100 );
   }
}


Since the paint method only draws the black square and the text "Hi Mom" that is what is printed.

Listen Here!S-nov23 4mins, Q-nov24 58secs Doc 25, Some Graphics Slide # 10

Cursors

Types of Cursors

CROSSHAIR_CURSOR NW_RESIZE_CURSOR
DEFAULT_CURSOR S_RESIZE_CURSOR
E_RESIZE_CURSOR SE_RESIZE_CURSOR
HAND_CURSOR SW_RESIZE_CURSOR
MOVE_CURSOR TEXT_CURSOR
N_RESIZE_CURSOR W_RESIZE_CURSOR
NE_RESIZE_CURSOR WAIT_CURSOR

These are defined as public static fields in java.awt.Cursor in JDK 1.1 and JDK 1.2. In JDK 1.0 they were defined in java.awt.Frame.


The setCursor( Cursor ) method in java.awt.Component changes the mouse Cursor
java.awt.Cursor Methods

Cursor getDefaultCursor()
String getName()
Cursor getPredefinedCursor(int type)
Cursor getSystemCustomCursor(String name)
int getType()
String toString()



Listen Here!Q-nov24 1min Doc 25, Some Graphics Slide # 11
Cursor Example
This example will cycle through all the different cursors. It displays the name of the cursor it is displaying. This example work with JDK 1.1. There is a shorter version of the program that works with JDK1.2.
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
class  CursorExample  extends  Frame {
   String cursorType = "Default Cursor";
   
   public  CursorExample  ( int  WidthInPixels, int heightInPixels ) {
      setTitle( "Cursors" );
      setSize( WidthInPixels, heightInPixels );
      setLayout( new FlowLayout() );      
      setLocation( 40, 40);
      Button next = new Button( "Next" );
      
      setCursor( Cursor.DEFAULT_CURSOR);
      add( next );
      next.addActionListener( new CursorListener() );
      show();
   }
   public  void  paint(  Graphics  display  )  {
      display.drawString( cursorType, 10, 60 );
   }
   public  static  void  main( String  args[] ){
      new  CursorExample( 150,  100 );
   }

Doc 25, Some Graphics Slide # 12
Cursor Example Continued
   class CursorListener implements ActionListener {
      int[] allCursors =  { Cursor.DEFAULT_CURSOR, 
         Cursor.CROSSHAIR_CURSOR, Cursor.TEXT_CURSOR, 
         Cursor.WAIT_CURSOR, Cursor.SW_RESIZE_CURSOR, 
         Cursor.SE_RESIZE_CURSOR, Cursor.NW_RESIZE_CURSOR, 
         Cursor.NE_RESIZE_CURSOR, Cursor.N_RESIZE_CURSOR, 
         Cursor.S_RESIZE_CURSOR, Cursor.W_RESIZE_CURSOR, 
         Cursor.E_RESIZE_CURSOR, Cursor.HAND_CURSOR, 
         Cursor.MOVE_CURSOR};
      String[] description = {  "Default Cursor" , "Crosshair Cursor" , 
         "Text Cursor" , "Wait Cursor" , "Southwest Resize Cursor" , 
         "Southeast Resize Cursor" , "Northwest Resize Cursor" , 
         "Northeast Resize Cursor" , "North Resize Cursor" ,
          "South Resize Cursor" , "West Resize Cursor" , "East Resize Cursor" ,
           "Hand Cursor" , "Move Cursor" };
      int cursorIndex = 0;
      public void actionPerformed( ActionEvent event )  {
         cursorIndex++;
         if ( cursorIndex >= allCursors.length )
            cursorIndex = 0;
         CursorExample.this.setCursor( allCursors[ cursorIndex ] );
         cursorType = description[ cursorIndex ];
         repaint();
      }
   }
}
Output





Note: cursors are platform dependent.

Copyright © 1998 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA.
All rights reserved.

visitors since 18-Nov-98