1
Features of Java
CS 3331
Fall 2009
2
Outline
Abstract class
Interface
Application --- animation applets
3
Motivation --- Drawing Board
4
Class Shape
public class Shape {
   private int x, y;
   private Color c;
   public Shape(int x, int y, Color c) {
      this.x = x; this.y = y; this.c = c;
   }
   public void draw(Graphics g) { /* … */ }
   public int getX() { return x; }
   public int getY() { return y; }
   public Color getColor { return c; }
}
Q: What is wrong with this definition?
5
At Least Two Problems
6
Solution: Abstract Class
public abstract class Shape {
   private int x, y;
   private Color c;
 
   protected Shape(int x, int y, Color c) {
      this.x = x; this.y = y; this.c = c;
   }
   public abstract void draw(Graphics g); // no body here!
   public int getX() { return x; }
   public int getY() { return y; }
   public Color getColor { return c; }
}
7
Abstract Classes?
Classes that can’t be instantiated
Used to define common properties thatare to be inherited by subclasses
Often provide partial implementations
May include abstract methods, methodsthat have no body
8
How Abstract Classes Solve theProblems?
9
In Sum, Abstract Classes …
Provide partial implementations to beinherited by subclasses
May include abstract methods
Are good for factoring out commonproperties among classes
10
Outline
Abstract classes
Interfaces
Application --- animation applets
11
Interfaces
Declare features to be supported by classes
Provide no implementation
Only allow public abstract methods andconstants (public static final fields)
public interface Runnable {
    public void run();
}
12
Why Interfaces?
To draw automobiles …
DrawingBoard
Circle
Rectangle
Triangle
Vehicle
Automobile
0..*
Shape
{abstract}
13
How to Draw Automobiles?
By programming to the interface.
14
In Sum, Interfaces …
Good for establishing a well-definedboundary between modules (subsystems)
Thus, make programs more reusable andmaintainable
15
Abstract Classes vs. Interfaces
Partial code vs. no code at all
Class vs. interface
16
Exercise
Separate the display of DigitalClock to support variousways of displaying time, e.g., digital, analog, customizedbackground, etc. Explain your design by drawing a UMLclass diagram.
DigitalClock
# timer: Timer
# font: Font
# color: Color
+ DigitalClock(): void
+ start(): void
+ stop(): void
+ paint(g: Graphics): void
17
Applications --- Animation Applets
Enhanced digital clock applet
Scrolling banner applet
Initial version
Double-buffered version
18
Enhanced Digital Clock Applet
Setting applet parameters in the Webpage
<html>
<applet code=“DigitalClock2.class” width=“250” height=“80”>
  <param name=“color” value=“blue”>
</applet>
</html>
19
Getting Applet Parameters
import java.awt.Color;
public class DigitalClock2 extends DigitalClock {
  public void init() {
     String param = getParameter(“color”);
      if (“red”.equals(param)) {
         color = Color.RED;
      } else if (“blue”.equals(param)) {
          color = Color.BLUE;
      } else if (“yellow”.equals(param)) {
          color = Color.YELLOW;
      } /* … */ else {
          color = Color.GREEN;
      }
  }
}
20
Animation Applets
Enhanced digital clock applet
Scrolling banner applet
Initial version
Double-buffered version
21
The java.awt.Graphics Class
Class Graphics
Represents graphics context, an abstraction ofvarious drawing surfaces, e.g., screen, printer, off-screen image (an image stored in memory).
Provide a rich set of graphics methods.
drawString()    drawLine()
drawArc()       fillArc()
drawOval()      fillOval()
drawPolygon()   fillPolygon()
drawRect()      fillRect()
drawRoundRect() fillRoundRect()
22
Graphics Class (Cont.)
Other methods
setColor(color) set the current color
setFont(font) set the current font
setPaintMode() set the paint, or overwrite mode
setXORMode(color) set the XOR mode
getColor() get the current color
getFont() get the current font
getFontMetrics() get the font metrics of the current font
getFontMetrics(font) get the font metrics for the specified font
23
The java.awt.FontMetrics Class
getAscent()
getDescent()
getHeight()
getLeading()
stringWidth(s)
Up
width
height
leading
ascent
descent
baseline
24
Scrolling Banner Applet
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ScrollingBanner extends java.applet.Applet {
 
  <field declarations>
 
  public void init() { ... }
  public void paint(Graphics g) { ... }
  public void start() { ... }
  public void stop() { ... }
}
25
Field Declarations
protected String text;
protected Font font =
     new java.awt.Font("Sans-serif", Font.BOLD, 24);
protected Dimension dim;
protected int x, y;
protected int delay = 100;
protected int offset = 1;
protected Timer timer; // animation timer
26
Initialization
public void init() {
  // get parameters "delay" and "text"
  String att = getParameter("delay");
  if (att != null) {
    delay = Integer.parseInt(att);
  }
  att = getParameter("text");
  if (att != null) {
    text = att;
  } else {
    text = “Go Miners!”;
  }
  // set initial position of the text
  dim = getSize();
  x = dim.width;
  y = font.getSize();
// initialize animation timer
timer = new Timer(delay,
   new ActionListener() {
       public void actionPerformed() {
           repaint();
       }
   });
}
27
Painting the Current Frame
Go Miners!
Go Miners!
Go Miners!
length
viewing area
(dim.width, y)
(dim.width-1, y)
(-length, y)
(x, y)
(0, 0)
leftmost position
rightmost position
current position
28
Painting the Current Frame (Cont.)
public void paint(Graphics g) {
  // get the font metrics to determine the length of the text
  g.setFont(font);
  FontMetrics fm = g.getFontMetrics();
  int length = fm.stringWidth(text);
  // adjust the position of text from the previous frame
  x = x - offset;
  // if the text is completely off to the left end
  // move the position back to the right end
  if (x < -length) { x = dim.width; }
  // set the pen color and draw the background
  g.setColor(Color.BLACK);
  g.fillRect(0, 0, dim.width, dim.height);
  // set the pen color, then draw the text
  g.setColor(Color.GREEN);
  g.drawString(text, x, y);
}
29
The start() and stop() Methods
public void start() {
  timer.start();
}
 
public void stop() {
  timer.stop();
}
30
Exercise
Define a subclass of ScrollingBanner, calledScrollingBanner3, that scrolls the bannervertically. Reuse code as much as possible andminimize code duplication.
31
How to Avoid Flickering?
Flickering is caused by repaint()
repaint() calls the update() method.
The default update() method does the following:
paint the whole area with the background color;
set the foreground color;
call the paint() method.
The update() method is also called by the system toupdate windows.
Solution:
override the update() method
use an off-screen image
32
Using Off-Screen Image
Double buffering
import java.awt.*;
public class ScrollingBanner2 extends ScrollingBanner {
  protected Image image;          // off-screen image
  protected Graphics offscreen; // off-screen graphics
  public update(Graphics g) { ... }
  public paint(Graphics g) { ... }
}
33
Using Off-Screen Image (Cont.)
public void update(Graphics g) {
    // create the offscreen image if it is the first time
    if (image == null) {      image = createImage(dim.width, dim.height);      offscreen = image.getGraphics();    }
    // draw the current frame into the off-screen image
    // using the paint method of the superclass
    super.paint(offscreen);
    // copy the off-screen image to the screen
    g.drawImage(image, 0, 0, this);
  }
  public void paint(Graphics g) {
    update(g);
  }
34
Animation Applet Idiom
Category
Behavioral implementation idiom
Intent
For an applet to continuously update itsappearance without user input or intervention
Also known as
Active Applet
Applicability
Use the Animation Applet Idiom to animatedynamic processes
35
Animation Applet Idiom (Cont.)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AnimationApplet extends java.applet.Applet {
  protected Timer timer = null;  protected int delay;
  public void init() {
     timer = new Timer(delay,
        new ActionListener() {
           public void actionPerformed() {
              repaint();
           }
       });
  }
36
Animation Applet Idiom (Cont.)
  public void start() {    timer.start();
  }
  public void stop() {
    timer.stop();
  }
 
  public void paint(Graphics g) {    <paint the current frame>
  }
  <other methods and fields>}