Transcript java1
Features of Java
CS 3331
Sections 4.4.7 and 5.5
1
Outline
Abstract class
Interface
Application --- animation applets
2
Motivation --- Drawing Board
java.applet.Applet
Shape
DrawingBoard
0..*
+ init(): void
+ paint(g: Graphics) : void
for (Shape s: shapes) {
s.draw(g);
}
shapes
- x: int
- y: int
- color: Color
+ getX(): int
+ getY(): int
+ getColor(): Color
+ draw(g: Graphics): void
Circle
Rectangle
Triangle
3
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 int getX() { return x; }
public int getY() { return y; }
public Color getColor { return c; }
public void draw(Graphics g) { /* … */ }
}
Q: What can be wrong with this implementation?
4
At Least Two Problems
Instantiation of the Shape class, e.g.,
Shape s = new Shape(10, 10, Color.RED);
Definition of the draw method
Null implementation, i.e.,
public void draw(Graphics g) { }
But, what if subclasses forget to override it?
=> not detected by Java compiler
5
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; }
}
6
Abstract Classes?
Classes that can’t be instantiated
Used to define common properties that
are to be inherited by subclasses
Often provide partial implementations
May include abstract methods, methods
that have no body
7
How Abstract Classes Solve the
Problems?
Instantiation of abstraction classes is
prohibited by Java compilers, e.g.,
new Shape(10, 10, Color.RED); // compilation error
No implementation for abstract method
Compilation error if concrete subclasses
provide no implementations for inherited
abstract methods
8
In Sum, Abstract Classes …
Provide partial implementations to be
inherited by subclasses
May include abstract methods
Are good for factoring out common
properties among classes
9
Outline
Abstract classes
Interfaces
Application --- animation applets
10
Interfaces
Declare features to be supported by classes
Provide no implementation (except for default
method in Java 8)
Only allow public abstract methods and
constants (public static final fields)
public interface ActionListener {
void actionPerformed(ActionEvent event);
}
11
Why Interfaces?
To draw automobiles …
0..*
DrawingBoard
Circle
Shape
{abstract}
Rectangle
Vehicle
Triangle
Automobile
12
How to Draw Automobiles?
By programming to the interface.
Vehicle
<<interface>>
Drawable
0..*
DrawingBoard
+ draw(g: Graphics) : void
Shape
{abstract}
Automobile
DrawableAutomobile
+ draw(g: Graphics) : void
Circle
Rectangle
Triangle
13
In Sum, Interfaces …
Good for establishing a well-defined
boundary between modules (subsystems)
Thus, make programs more reusable and
maintainable
14
Abstract Classes vs. Interfaces
Partial code vs. no code at all (except for
default method in Java 8)
Class vs. interface
15
Exercise
Separate the display of DigitalClock to support various
ways of displaying time, e.g., digital, analog, customized
background, etc. Explain your design by drawing a UML
class diagram.
DigitalClock
# timer: Timer
# font: Font
# color: Color
+ DigitalClock(): void
+ start(): void
+ stop(): void
+ paint(g: Graphics): void
16
Applications --- Animation Applets
Enhanced digital clock applet
Scrolling banner applet
Initial version
Double-buffered version
17
Enhanced Digital Clock Applet
Setting applet parameters in the Web
page
<html>
…
<applet code=“DigitalClock2.class” width=“250” height=“80”>
<param name=“color” value=“blue”>
</applet>
…
</html>
18
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;
}
}
}
19
Animation Applets
Enhanced digital clock applet
Scrolling banner applet
Initial version
Double-buffered version
20
The java.awt.Graphics Class
Class Graphics
Represents graphics context, an abstraction of
various drawing surfaces, e.g., screen, printer, offscreen image (an image stored in memory).
Provide a rich set of graphics methods.
drawString()
drawArc()
drawOval()
drawPolygon()
drawRect()
drawRoundRect()
drawLine()
fillArc()
fillOval()
fillPolygon()
fillRect()
fillRoundRect()
21
Graphics Class (Cont.)
Other methods
setColor(color)
setFont(font)
setPaintMode()
setXORMode(color)
getColor()
getFont()
getFontMetrics()
getFontMetrics(font)
set the current color
set the current font
set the paint, or overwrite mode
set the XOR mode
get the current color
get the current font
get the font metrics of the current font
get the font metrics for the specified font
22
The java.awt.FontMetrics Class
Information about the rendering of a particular font
on a particular screen.
leading
ascent
descent
Up
height
baseline
width
getAscent()
getDescent()
getHeight()
getLeading()
stringWidth(s)
23
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() { ... }
}
24
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
25
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,
e -> repaint());
26
Painting the Current Frame
(0, 0)
length
viewing area
Go Miners!
Go Miners!
(-length, y)
(x, y)
leftmost position
current position
Go Miners!
(dim.width-1, y) (dim.width, y)
rightmost position
27
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);
}
28
The start() and stop() Methods
public void start() {
timer.start();
}
public void stop() {
timer.stop();
}
29
Exercise: Vertical Scrolling
Define a subclass of ScrollingBanner, called
ScrollingBanner3, that scrolls the banner
vertically. Reuse code as much as possible and
minimize code duplication.
30
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 to
update windows.
Solution:
override the update() method
use an off-screen image
31
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) { ... }
}
32
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);
}
33
Animation Applet Idiom
Category
Behavioral implementation idiom
Intent
For an applet to continuously update its
appearance without user input or intervention
Also known as
Active Applet
Applicability
Use the Animation Applet Idiom to animate
dynamic processes
34
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, e -> repaint());
}
35
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>
}
36
Exercise: Multiple Bouncing
Balls
Enhance the bouncing ball applet in Example
8.12 of the textbook to support multiple balls.
Bounce several balls of different sizes.
Change directions of balls when they collide with each
other.
Use an applet parameter, say numOfBalls, to specify
the number of balls to bounce.
Optionally, play a beep sound when a ball collides with
another ball.
37