Presentation is loading. Please wait.

Presentation is loading. Please wait.

Features of Java CS 3331 Sections 4.4.7 and 5.5.

Similar presentations


Presentation on theme: "Features of Java CS 3331 Sections 4.4.7 and 5.5."— Presentation transcript:

1 Features of Java CS 3331 Sections and 5.5

2 Outline Abstract class Interface Application --- animation applets

3 Motivation --- Drawing Board
+ init(): void + paint(g: Graphics) : void DrawingBoard Triangle + getX(): int + getY(): int + getColor(): Color + draw(g: Graphics): void - x: int - y: int - color: Color Shape 0..* shapes Circle Rectangle java.applet.Applet for (Shape s: shapes) { s.draw(g); }

4 Class Shape Q: What can be wrong with this implementation?
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?

5 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

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 that are to be inherited by subclasses Often provide partial implementations May include abstract methods, methods that have no body

8 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

9 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

10 Outline Abstract classes Interfaces Application --- animation applets

11 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); }

12 Why Interfaces? To draw automobiles … 0..* Shape {abstract}
DrawingBoard Vehicle Circle Rectangle Triangle Automobile

13 How to Draw Automobiles?
By programming to the interface. + draw(g: Graphics) : void DrawableAutomobile Vehicle Automobile <<interface>> Drawable + draw(g: Graphics) : void 0..* DrawingBoard Shape {abstract} Circle Rectangle Triangle

14 In Sum, Interfaces … Good for establishing a well-defined boundary between modules (subsystems) Thus, make programs more reusable and maintainable

15 Abstract Classes vs. Interfaces
Partial code vs. no code at all (except for default method in Java 8) Class vs. interface

16 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

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 Web page <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 of various 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
Information about the rendering of a particular font on a particular screen. leading Up ascent height baseline descent width getAscent() getDescent() getHeight() getLeading() stringWidth(s)

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"); 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());

27 Painting the Current Frame
(0, 0) length viewing area Go Miners! Go Miners! Go Miners! (-length, y) (x, y) (dim.width-1, y) (dim.width, y) leftmost position current position rightmost 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: Vertical Scrolling
Define a subclass of ScrollingBanner, called ScrollingBanner3, that scrolls the banner vertically. Reuse code as much as possible and minimize 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 to update 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 its appearance without user input or intervention Also known as Active Applet Applicability Use the Animation Applet Idiom to animate dynamic 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, e -> 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> }

37 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.


Download ppt "Features of Java CS 3331 Sections 4.4.7 and 5.5."

Similar presentations


Ads by Google