chapter 7 (graphics and animation) - nyu
TRANSCRIPT
7-1 Copyright (c) 1999-2004 N. Afshartous
Contents1. Classes and Objects
2. Inheritance
3. Interfaces
4. Exceptions and Error Handling
5. Intro to Concurrency
6. Concurrency in Java
7. Graphics and Animation8. Applets
7-2 Copyright (c) 1999-2004 N. Afshartous
Chapter 7: Graphics and ImagesAfter this chapter you will be able to:
- Create windows
- Draw lines, shapes, and text
- Download and display images
- Use double-buffering and threads to create animation
7-3 Copyright (c) 1999-2004 N. Afshartous
Creating a Window• Create a subclass of class Frame
import java.awt.Frame;
public class Main extends Frame {public static void main (String [] args) {
Frame f = new Main();f.resize(200,200); // set width and heightf.show(); // display window
}}
7-4 Copyright (c) 1999-2004 N. Afshartous
Displayed Window
7-5 Copyright (c) 1999-2004 N. Afshartous
Inheritance Hierchy• Class Frame has several superclasses
Object
Component
Container
Window
Frame
7-6 Copyright (c) 1999-2004 N. Afshartous
Drawing Onto A Window• Define methodpaint and use the passed
graphics context to draw onto the window
• The methods for drawing are defined in class Graphics
import java.awt.Frame;import java.awt.Graphics;
public class Main extends Frame {public static void main (String [] args) {...}
public void paint (Graphics g) {g.drawString("hello there", 10,10);
// x, y}
}
7-7 Copyright (c) 1999-2004 N. Afshartous
Displayed Windowx = 0y = 0
x
y
7-8 Copyright (c) 1999-2004 N. Afshartous
Redrawing• Redrawing is required:
– initially when window appears
– after resizing
– after part of the window becomes exposed after being hidden
• System calls update to redraw
• Default implementation of update clears screen and calls paint
• Program can request a redraw to callingrepaint
7-9 Copyright (c) 1999-2004 N. Afshartous
Methods Called for Redraw• Program can call repaint and the system can
call update
public void update(Graphics g);
public void paint(Graphics g);
public void repaint();
7-10 Copyright (c) 1999-2004 N. Afshartous
Drawing Text• Method drawString of class Graphics
displays a string at the specified coordinates using the current font
public void drawString(String x, int x, int y);
7-11 Copyright (c) 1999-2004 N. Afshartous
Creating Fonts• Fonts may be created by calling theFont class
constructor
• Name is one of: Helvetica, TimesRoman, Courier, Dialog, Symbol
• Font property is the sum of any of the following constants:– Font.BOLD
– Font.ITALIC
– Font.PLAIN
public Font (String name, int property, int size);
7-12 Copyright (c) 1999-2004 N. Afshartous
Changing Font• New Font is passed to Graphics.setFont
public void paint (Graphics g) {Font hvFont = new Font("Helvetica", Font.BOLD, 20);g.setFont(hvFont);g.drawString("hello there", 20,20);
}
7-13 Copyright (c) 1999-2004 N. Afshartous
Measuring Text• Can get aFontMetrics object by calling
Graphics.getFontMetrics
• Class FontMetrics has methods:
– returns the width of a string in a given font
– returns the height of a line of text in a given font
• and others
public int getHeight();
public int stringWidth(String str);
7-14 Copyright (c) 1999-2004 N. Afshartous
Getting Window Size• Can call inherited method size of class
Component
– Returns aDimension object which encapsulates the currentwidth and height
of the window
– Dimension.height
– Dimension.width
public Dimension size();
7-15 Copyright (c) 1999-2004 N. Afshartous
Example• Centering a string inside a window
public void paint (Graphics g) {Dimension d = size(); // resizing is OKFont hvFont = new Font("Helvetica", Font.BOLD, 20);FontMetrics hvMetrics = g.getFontMetrics(hvFont);g.setFont(hvFont);int x = d.width/2 -
hvMetrics.stringWidth("hello there")/2;int y = d.height/2 - hvMetrics.getHeight()/2;g.drawString("hello there", x, y);
}
7-16 Copyright (c) 1999-2004 N. Afshartous
Displayed Window
7-17 Copyright (c) 1999-2004 N. Afshartous
Drawing Shapes• Class Graphics defines the following methods:
public abstract void drawLine(int x1, int y1, int x2, int y2)
public abstract void drawOval(int x, int y,int width, int height)
public abstract void drawPolygon (int xPoints[], int yPoints[], int nPoints)
public void drawRect(int x, int y,int width, int height);
7-18 Copyright (c) 1999-2004 N. Afshartous
Drawing Circles• Pass coordinates of upper left corner of box
containing the circle, width, and heightpublic void paint (Graphics g) {
g.drawOval(0,0,30,30);// x, y of upper left corner// width, height
}
7-19 Copyright (c) 1999-2004 N. Afshartous
Filling Circle• Each draw method has a fill version
public void paint (Graphics g) {g.fillOval(0,0,30,30);
// x, y of upper left corner// width, height
}
7-20 Copyright (c) 1999-2004 N. Afshartous
Color• Class Color defines the following constants:
public final static Color black; public final static Color blue;public final static Color cyan; public final static Color darkGray;public final static Color gray;public final static Color green;public final static Color lightGray;public final static Color magenta;public final static Color orange;public final static Color pink;public final static Color red;public final static Color white;public final static Color yellow;
7-21 Copyright (c) 1999-2004 N. Afshartous
Creating New Colors• Can create a new color by calling aColor
class constructor
• Or by calling class Color methods:
public Color(float red, float green, float blue);public Color(int rgb);public Color(int red, int green, int blue);
public Color brighter();public Color darker();
7-22 Copyright (c) 1999-2004 N. Afshartous
Setting Current Color• Call method setColor of class Graphics
public void paint (Graphics g) {g.setColor(Color.cyan);g.fillOval(0,0,30,30);
}
7-23 Copyright (c) 1999-2004 N. Afshartous
Images• Images can be displayed by:
– calling Toolkit.getImage to load an image
– and then by callingGraphics.drawImage
to display the image
public abstract Image getImage(URL url);public abstract Image getImage(String filename);
public abstract boolean drawImage (Image img, int x, int y, ImageObserver observer)
7-24 Copyright (c) 1999-2004 N. Afshartous
Interface ImageObserver• Class Component (and it’s subclasses)
implement interface ImageObserver
Object
ComponentimplementsImageObserver
Container
Window
Frame
7-25 Copyright (c) 1999-2004 N. Afshartous
ImageObserver• Interface ImageObserver
public interface java.awt.image.ImageObserver {// flags for the infoflags argument to imageUpdate// flags are used to indicate status loadingpublic final static int ABORT; // was abortedpublic final static int ALLBITS; // loading compl ete
public final static int ERROR; // error loadingpublic final static int FRAMEBITS; // frame loadedpublic final static int HEIGHT; // height availablepublic final static int PROPERTIES // props availab lepublic final static int SOMEBITS; // partially loade dpublic final static int WIDTH; // width available
public abstract booleanimageUpdate(Image img, int infoflags,int x, int y, int width, int height);
}
7-26 Copyright (c) 1999-2004 N. Afshartous
Image Loading• Calling Graphics.drawImage spawns a
background thread to manage the image loading
• Calling drawImage may not display anything image if the image has not finished loading
• The imageUpdate method of theImageObserver parameter to drawImage is repeatedly called by the background thread during image loading
• Default implementation ofimageUpdate calls update to redraw
7-27 Copyright (c) 1999-2004 N. Afshartous
Displaying An Image
public void paint (Graphics g) {Image img =
Toolkit.getDefaultToolkit().getImage("nick.jpg");g.drawImage(img, 0, 0, null);
}
• getDefaultToolkit returns a Toolkit
object
• null is passed to drawImage
as the ImageObserver to indicate no calls toimageUpdate are necessary
7-28 Copyright (c) 1999-2004 N. Afshartous
Animation• Make a separate thread object for each animated
figure
• The code to position the animated figures is then calculated independently by each thread
• Later we’ll incorporate double-buffering to eliminate flicker
• Flicker results from clearing the entire screen in between redraws and makes the animation look less smooth
7-29 Copyright (c) 1999-2004 N. Afshartous
Animated Circlesclass AnimCircle extends Thread {
private Point upperLeft;public static int width; // window width
public AnimCircle (int x, int y) {upperLeft = new Point(x,y);
}
public synchronized Point getPosition () { return upperLeft;
}
private synchronized void move () {upperLeft.x++; if (upperLeft.x >= width) upperLeft.x = 0;
}
public void run () {...}}
7-30 Copyright (c) 1999-2004 N. Afshartous
Circles’s Next Position
class AnimCircle extends Thread {...public void run () {
while (true) {move();
try {Thread.sleep(20);
} catch (InterruptedException e) {}}
}}
• run repeatedly calls move to update position
7-31 Copyright (c) 1999-2004 N. Afshartous
Class Animimport java.awt.*; import java.util.Vector;
public class Anim extends Frame{static Vector circles = new Vector();
public static void main (String [] args) {AnimCircle c1 = new AnimCircle(0,40);AnimCircle c2 = new AnimCircle(0,80);circles.addElement(c1);circles.addElement(c2);AnimCircle.width = 300;Frame f = new Anim();f.resize(300,300);f.show(); // start circle threadsc1.start(); c2.start();
}public void paint (Graphics g) {...}
}
7-32 Copyright (c) 1999-2004 N. Afshartous
Drawing Circles• Paint draws the circles and then calls repaint
import java.awt.*; import java.util.Vector;
public class Anim extends Frame{...
public void paint (Graphics g) {for (int i = 0; i < circles.size(); i++) {
Point upperLeft = ((AnimCircle) circles.elementAt(i)).getPosition();g.drawOval(upperLeft.x, upperLeft.y, 20, 20);
}repaint();
}}
7-33 Copyright (c) 1999-2004 N. Afshartous
Animated Scene• Circles move toward the right and then start
again from the left
7-34 Copyright (c) 1999-2004 N. Afshartous
Double-Buffering• Use an offscreen image for drawing
• After drawing next scene on the offscreen image display offscreen image on window
• Double-buffering eliminates flicker
Off Screen Image Window
overlay
DrawDraw
7-35 Copyright (c) 1999-2004 N. Afshartous
Off Screen Image• Declare variables for the off screen image and
associated Graphics context
import java.awt.*; import java.util.Vector;
public class Anim extends Frame{
static Vector circles = new Vector();static int imageWidth = 300;static int imageHeight = 300;static Image offScreenImage;static Graphics offg;...
7-36 Copyright (c) 1999-2004 N. Afshartous
Drawing Onto Off Screen Image• Override update so window will not be cleared
import java.awt.*; import java.util.Vector;
public class Anim extends Frame{...
// must override update or window will be cleared// between redraws resulting in flicker!!!
public void update (Graphics g) {paint(g);
}
public void paint (Graphics g) {...
} }
7-37 Copyright (c) 1999-2004 N. Afshartous
Paint
public void paint (Graphics g) {if (offg == null) {
offScreenImage = createImage(imageWidth,imageHeight);offg = offScreenImage.getGraphics();
}offg.setColor(Color.white); // clear backgroundoffg.fillRect(0, 0, imageWidth, imageHeight);offg.setColor(Color.black);for (int i = 0; i < circles.size(); i++) {
Point upperLeft = ((AnimCircle) circles.elementAt(i)).getPosition();
offg.fillOval(upperLeft.x, upperLeft.y, 40, 40);}g.drawImage(offScreenImage, 0, 0, null);repaint();
}
• Draw on off screen image then overlay
7-38 Copyright (c) 1999-2004 N. Afshartous
It’s Exercise Time