- •CONTENTS
- •1.1 Introduction
- •1.2 What Is a Computer?
- •1.3 Programs
- •1.4 Operating Systems
- •1.5 Java, World Wide Web, and Beyond
- •1.6 The Java Language Specification, API, JDK, and IDE
- •1.7 A Simple Java Program
- •1.8 Creating, Compiling, and Executing a Java Program
- •1.9 (GUI) Displaying Text in a Message Dialog Box
- •2.1 Introduction
- •2.2 Writing Simple Programs
- •2.3 Reading Input from the Console
- •2.4 Identifiers
- •2.5 Variables
- •2.7 Named Constants
- •2.8 Numeric Data Types and Operations
- •2.9 Problem: Displaying the Current Time
- •2.10 Shorthand Operators
- •2.11 Numeric Type Conversions
- •2.12 Problem: Computing Loan Payments
- •2.13 Character Data Type and Operations
- •2.14 Problem: Counting Monetary Units
- •2.15 The String Type
- •2.16 Programming Style and Documentation
- •2.17 Programming Errors
- •2.18 (GUI) Getting Input from Input Dialogs
- •3.1 Introduction
- •3.2 boolean Data Type
- •3.3 Problem: A Simple Math Learning Tool
- •3.4 if Statements
- •3.5 Problem: Guessing Birthdays
- •3.6 Two-Way if Statements
- •3.7 Nested if Statements
- •3.8 Common Errors in Selection Statements
- •3.9 Problem: An Improved Math Learning Tool
- •3.10 Problem: Computing Body Mass Index
- •3.11 Problem: Computing Taxes
- •3.12 Logical Operators
- •3.13 Problem: Determining Leap Year
- •3.14 Problem: Lottery
- •3.15 switch Statements
- •3.16 Conditional Expressions
- •3.17 Formatting Console Output
- •3.18 Operator Precedence and Associativity
- •3.19 (GUI) Confirmation Dialogs
- •4.1 Introduction
- •4.2 The while Loop
- •4.3 The do-while Loop
- •4.4 The for Loop
- •4.5 Which Loop to Use?
- •4.6 Nested Loops
- •4.7 Minimizing Numeric Errors
- •4.8 Case Studies
- •4.9 Keywords break and continue
- •4.10 (GUI) Controlling a Loop with a Confirmation Dialog
- •5.1 Introduction
- •5.2 Defining a Method
- •5.3 Calling a Method
- •5.4 void Method Example
- •5.5 Passing Parameters by Values
- •5.6 Modularizing Code
- •5.7 Problem: Converting Decimals to Hexadecimals
- •5.8 Overloading Methods
- •5.9 The Scope of Variables
- •5.10 The Math Class
- •5.11 Case Study: Generating Random Characters
- •5.12 Method Abstraction and Stepwise Refinement
- •6.1 Introduction
- •6.2 Array Basics
- •6.3 Problem: Lotto Numbers
- •6.4 Problem: Deck of Cards
- •6.5 Copying Arrays
- •6.6 Passing Arrays to Methods
- •6.7 Returning an Array from a Method
- •6.8 Variable-Length Argument Lists
- •6.9 Searching Arrays
- •6.10 Sorting Arrays
- •6.11 The Arrays Class
- •7.1 Introduction
- •7.2 Two-Dimensional Array Basics
- •7.3 Processing Two-Dimensional Arrays
- •7.4 Passing Two-Dimensional Arrays to Methods
- •7.5 Problem: Grading a Multiple-Choice Test
- •7.6 Problem: Finding a Closest Pair
- •7.7 Problem: Sudoku
- •7.8 Multidimensional Arrays
- •8.1 Introduction
- •8.2 Defining Classes for Objects
- •8.3 Example: Defining Classes and Creating Objects
- •8.4 Constructing Objects Using Constructors
- •8.5 Accessing Objects via Reference Variables
- •8.6 Using Classes from the Java Library
- •8.7 Static Variables, Constants, and Methods
- •8.8 Visibility Modifiers
- •8.9 Data Field Encapsulation
- •8.10 Passing Objects to Methods
- •8.11 Array of Objects
- •9.1 Introduction
- •9.2 The String Class
- •9.3 The Character Class
- •9.4 The StringBuilder/StringBuffer Class
- •9.5 Command-Line Arguments
- •9.6 The File Class
- •9.7 File Input and Output
- •9.8 (GUI) File Dialogs
- •10.1 Introduction
- •10.2 Immutable Objects and Classes
- •10.3 The Scope of Variables
- •10.4 The this Reference
- •10.5 Class Abstraction and Encapsulation
- •10.6 Object-Oriented Thinking
- •10.7 Object Composition
- •10.8 Designing the Course Class
- •10.9 Designing a Class for Stacks
- •10.10 Designing the GuessDate Class
- •10.11 Class Design Guidelines
- •11.1 Introduction
- •11.2 Superclasses and Subclasses
- •11.3 Using the super Keyword
- •11.4 Overriding Methods
- •11.5 Overriding vs. Overloading
- •11.6 The Object Class and Its toString() Method
- •11.7 Polymorphism
- •11.8 Dynamic Binding
- •11.9 Casting Objects and the instanceof Operator
- •11.11 The ArrayList Class
- •11.12 A Custom Stack Class
- •11.13 The protected Data and Methods
- •11.14 Preventing Extending and Overriding
- •12.1 Introduction
- •12.2 Swing vs. AWT
- •12.3 The Java GUI API
- •12.4 Frames
- •12.5 Layout Managers
- •12.6 Using Panels as Subcontainers
- •12.7 The Color Class
- •12.8 The Font Class
- •12.9 Common Features of Swing GUI Components
- •12.10 Image Icons
- •13.1 Introduction
- •13.2 Exception-Handling Overview
- •13.3 Exception-Handling Advantages
- •13.4 Exception Types
- •13.5 More on Exception Handling
- •13.6 The finally Clause
- •13.7 When to Use Exceptions
- •13.8 Rethrowing Exceptions
- •13.9 Chained Exceptions
- •13.10 Creating Custom Exception Classes
- •14.1 Introduction
- •14.2 Abstract Classes
- •14.3 Example: Calendar and GregorianCalendar
- •14.4 Interfaces
- •14.5 Example: The Comparable Interface
- •14.6 Example: The ActionListener Interface
- •14.7 Example: The Cloneable Interface
- •14.8 Interfaces vs. Abstract Classes
- •14.9 Processing Primitive Data Type Values as Objects
- •14.10 Sorting an Array of Objects
- •14.11 Automatic Conversion between Primitive Types and Wrapper Class Types
- •14.12 The BigInteger and BigDecimal Classes
- •14.13 Case Study: The Rational Class
- •15.1 Introduction
- •15.2 Graphical Coordinate Systems
- •15.3 The Graphics Class
- •15.4 Drawing Strings, Lines, Rectangles, and Ovals
- •15.5 Case Study: The FigurePanel Class
- •15.6 Drawing Arcs
- •15.7 Drawing Polygons and Polylines
- •15.8 Centering a String Using the FontMetrics Class
- •15.9 Case Study: The MessagePanel Class
- •15.10 Case Study: The StillClock Class
- •15.11 Displaying Images
- •15.12 Case Study: The ImageViewer Class
- •16.1 Introduction
- •16.2 Event and Event Source
- •16.3 Listeners, Registrations, and Handling Events
- •16.4 Inner Classes
- •16.5 Anonymous Class Listeners
- •16.6 Alternative Ways of Defining Listener Classes
- •16.7 Problem: Loan Calculator
- •16.8 Window Events
- •16.9 Listener Interface Adapters
- •16.10 Mouse Events
- •16.11 Key Events
- •16.12 Animation Using the Timer Class
- •17.1 Introduction
- •17.2 Buttons
- •17.3 Check Boxes
- •17.4 Radio Buttons
- •17.5 Labels
- •17.6 Text Fields
- •17.7 Text Areas
- •17.8 Combo Boxes
- •17.9 Lists
- •17.10 Scroll Bars
- •17.11 Sliders
- •17.12 Creating Multiple Windows
- •18.1 Introduction
- •18.2 Developing Applets
- •18.3 The HTML File and the <applet> Tag
- •18.4 Applet Security Restrictions
- •18.5 Enabling Applets to Run as Applications
- •18.6 Applet Life-Cycle Methods
- •18.7 Passing Strings to Applets
- •18.8 Case Study: Bouncing Ball
- •18.9 Case Study: TicTacToe
- •18.10 Locating Resources Using the URL Class
- •18.11 Playing Audio in Any Java Program
- •18.12 Case Study: Multimedia Animations
- •19.1 Introduction
- •19.2 How is I/O Handled in Java?
- •19.3 Text I/O vs. Binary I/O
- •19.4 Binary I/O Classes
- •19.5 Problem: Copying Files
- •19.6 Object I/O
- •19.7 Random-Access Files
- •20.1 Introduction
- •20.2 Problem: Computing Factorials
- •20.3 Problem: Computing Fibonacci Numbers
- •20.4 Problem Solving Using Recursion
- •20.5 Recursive Helper Methods
- •20.6 Problem: Finding the Directory Size
- •20.7 Problem: Towers of Hanoi
- •20.8 Problem: Fractals
- •20.9 Problem: Eight Queens
- •20.10 Recursion vs. Iteration
- •20.11 Tail Recursion
- •APPENDIXES
- •INDEX
498 Chapter 15 Graphics
|
15.1 Introduction |
Problem |
Suppose you wish to draw shapes such as a bar chart, a clock, or a stop sign, as shown in |
|
Figure 15.1. How do you do so? |
|
This chapter describes how to use the methods in the Graphics class to draw strings, lines, |
|
rectangles, ovals, arcs, polygons, and images, and how to develop reusable GUI components. |
(a) |
(b) |
(c) |
FIGURE 15.1 You can draw shapes using the drawing methods in the Graphics class.
15.2 Graphical Coordinate Systems
To paint, you need to specify where to paint. Each component has its own coordinate system with the origin (0, 0) at the upper-left corner. The x-coordinate increases to the right, and the y-coordinate increases downward. Note that the Java coordinate system differs from the conventional coordinate system, as shown in Figure 15.2.
|
x |
|
(0, 0) |
Y axis |
|
X axis |
||
|
y
(x, y)
(0, 0) |
X axis |
Java Coordinate |
Conventional |
|
Coordinate |
||
System |
||
System |
||
|
Y axis
FIGURE 15.2 The Java coordinate system is measured in pixels, with (0, 0) at its upperleft corner.
The location of the upper-left corner of a component c1 (e.g., a button) inside its parent component c2 (e.g., a panel) can be located using c1.getX() and c1.getY(). As shown in Figure 15.3, (x1, y1) = (c1.getX(), c1.getY()), (x2, y2) = (c2.getX(),
c2.getY()), and (x3, y3) = (c3.getX(), c3.getY()). |
|
|
(x3, y3) (0, 0) |
Component c3 |
c3’s coordinate |
|
|
system |
(x2, y2) (0, 0) |
Component c2 |
c2’s coordinate |
|
|
|
|
|
system |
(x1, y1) (0, 0) |
Component c1 |
|
|
|
c1’s coordinate |
|
|
system |
FIGURE 15.3 Each GUI component has its own coordinate system.
15.3 The Graphics Class 499
15.3 The Graphics Class
The Graphics class provides the methods for drawing strings, lines, rectangles, ovals, arcs, polygons, and polylines, as shown in Figure 15.4.
Think of a GUI component as a piece of paper and the Graphics object as a pencil or paintbrush. You can apply the methods in the Graphics class to draw things on a GUI component.
java.awt.Graphics
+setColor(color: Color): void
+setFont(font: Font): void
+drawString(s: String, x: int, y: int): void
+drawLine(x1: int, y1: int, x2: int, y2: int): void
+drawRect(x: int, y: int, w: int, h: int): void
+fillRect(x: int, y: int, w: int, h: int): void
+drawRoundRect(x: int, y: int, w: int, h: int, aw: int, ah: int): void
+fillRoundRect(x: int, y: int, w: int, h: int, aw: int, ah: int): void
+draw3DRect(x: int, y: int, w: int, h: int, raised: boolean): void
+fill3DRect(x: int, y: int, w: int, h: int, raised: boolean): void
+drawOval(x: int, y: int, w: int, h: int): void
+fillOval(x: int, y: int, w: int, h: int): void
+drawArc(x: int, y: int, w: int, h: int, startAngle: int, arcAngle: int): void
+fillArc(x: int, y: int, w: int, h: int, startAngle: int, arcAngle: int): void
+drawPolygon(xPoints: int[], yPoints: int[], nPoints: int): void
+fillPolygon(xPoints: int[], yPoints: int[], nPoints: int): void
+drawPolygon(g: Polygon): void
+fillPolygon(g: Polygon): void
+drawPolyline(xPoints: int[], yPoints: int[], nPoints: int): void
Sets a new color for subsequent drawings.
Sets a new font for subsequent drawings.
Draws a string starting at point (x, y).
Draws a line from (x1, y1) to (x2, y2).
Draws a rectangle with specified upper-left corner point at (x,y) and width w and height h.
Draws a filled rectangle with specified upper-left corner point at (x, y) and width w and height h.
Draws a round-cornered rectangle with specified arc width aw and arc height ah.
Draws a filled round-cornered rectangle with specified arc width aw and arc height ah.
Draws a 3-D rectangle raised above the surface or sunk into the surface.
Draws a filled 3-D rectangle raised above the surface or sunk into the surface.
Draws an oval bounded by the rectangle specified by the parameters x, y, w, and h.
Draws a filled oval bounded by the rectangle specified by the parameters x, y, w, and h.
Draws an arc conceived as part of an oval bounded by the rectangle specified by the parameters x, y, w, and h.
Draws a filled arc conceived as part of an oval bounded by the rectangle specified by the parameters x, y, w, and h.
Draws a closed polygon defined by arrays of x- and
y-coordinates. Each pair of (x[i], y[i])-coordinates is a point.
Draws a filled polygon defined by arrays of x- and
y-coordinates. Each pair of (x[i], y[i])-coordinates is a point. Draws a closed polygon defined by a Polygon object.
Draws a filled polygon defined by a Polygon object.
Draws a polyline defined by arrays of x- and y-coordinates. Each pair of (x[i], y[i])-coordinates is a point.
FIGURE 15.4 The Graphics class contains the methods for drawing strings and shapes.
The Graphics class–an abstract class—provides a device-independent graphics interface for displaying figures and images on the screen on different platforms. Whenever a component (e.g., a button, a label, a panel) is displayed, the JVM automatically creates a Graphics object for the component on the native platform and passes this object to invoke the paintComponent method to display the drawings.
The signature of the paintComponent method is as follows:
protected void paintComponent(Graphics g)
This method, defined in the JComponent class, is invoked whenever a component is first displayed or redisplayed.
500 Chapter 15 Graphics
In order to draw things on a component, you need to define a class that extends JPanel and overrides its paintComponent method to specify what to draw. Listing 15.1 gives an example that draws a line and a string on a panel, as shown in Figure 15.5.
LISTING 15.1 TestPaintComponent.java
1 import javax.swing.*;
2 import java.awt.Graphics;
3
4 public class TestPaintComponent extends JFrame {
|
5 |
public TestPaintComponent() { |
||
create a panel |
6 |
add( |
new NewPanel() |
); |
|
7 |
} |
|
|
|
8 |
|
|
|
|
9 |
public static void main(String[] args) { |
10TestPaintComponent frame = new TestPaintComponent();
11frame.setTitle("TestPaintComponent");
12frame.setSize(200, 100);
13frame.setLocationRelativeTo(null); // Center the frame
14frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15frame.setVisible(true);
16}
17}
|
18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new panel class |
19 |
class NewPanel extends JPanel { |
|
|
|
|
||||||||||||
override paintComponent |
20 |
|
|
protected void paintComponent(Graphics g) { |
|
|
||||||||||||
draw things in the superclass |
21 |
|
|
|
|
super.paintComponent(g); |
|
|
|
|
|
|||||||
draw line |
22 |
|
|
|
|
g.drawLine(0, 0, 50, 50); |
|
|
|
|
|
|||||||
draw string |
23 |
|
|
|
|
g.drawString("Banner", 0, 40); |
|
|
|
|
||||||||
|
24 |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(0, 0) |
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
(0, 40) |
|
|
|
|
|
|
|
|
|
|
This is a JPanel |
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
(50, |
50) |
|
|
|
|
|
|
|
|
|
|
object placed |
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
inside a frame
FIGURE 15.5 A line and a string are drawn on a panel.
The paintComponent method is automatically invoked to paint graphics when the component is first displayed or whenever the component needs to be redisplayed. Invoking super.paintComponent(g) (line 21) invokes the paintComponent method defined in the superclass. This is necessary to ensure that the viewing area is cleared before a new drawing is displayed. Line 22 invokes the drawLine method to draw a line from (0, 0) to (50, 50). Line 23 invokes the drawString method to draw a string.
All the drawing methods have parameters that specify the locations of the subjects to be drawn. All measurements in Java are made in pixels. The string “Banner” is drawn at location (0, 40).
The JVM invokes paintComponent to draw things on a component. The user should never invoke paintComponent directly. For this reason, the protected visibility is sufficient for paintComponent.
Panels are invisible and are used as small containers that group components to achieve a desired layout. Another important use of JPanel is for drawing. You can draw things on any Swing GUI component, but normally you should use a JPanel as a canvas upon which to draw things. What happens if you replace JPanel with JLabel in line 19 as follows?
class NewPanel extends JLabel {
15.4 Drawing Strings, Lines, Rectangles, and Ovals 501
The program will work, but it is not preferred, because JLabel is designed for creating a label, extends JPanel? not for drawing. For consistency, this book will define a canvas class by subclassing JPanel.
Tip
Some textbooks define a canvas class by subclassing JComponent. The problem is that, if you |
extends JComponent? |
wish to set a background in the canvas, you have to write the code to paint the background color. |
|
A simple setBackground(Color color) method will not set a background color in a |
|
JComponent. |
|
15.4 Drawing Strings, Lines, Rectangles, and Ovals
The drawString(String s, int x, int y) method draws a string starting at the point |
drawString |
(x, y), as shown in Figure 15.6(a). |
|
The drawLine(int x1, int y1, int x2, int y2) method draws a straight line from |
drawLine |
point (x1, y1) to point (x2, y2), as shown in Figure 15.6(b). |
|
(0, 0) |
|
(getWidth(), 0) |
(0, 0) |
|
(getWidth(), 0) |
|||||
|
|
|
|
|
|
(x1, |
y1) |
|
|
|
(x, y) |
|
|
s is displayed here |
|
|
|
|
(x2, |
y2) |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
(0, getHeight()) |
(getWidth(), getHeight()) |
(0, getHeight()) |
(getWidth(), getHeight()) |
|||||||
|
|
|
(a) drawString |
|
|
(b) drawLine |
|
|
FIGURE 15.6 (a) The drawString(s, x, y) method draws a string starting at (x, y). (b) The drawLine(x1, y1, x2, y2) method draws a line between two specified points.
Java provides six methods for drawing rectangles in outline or filled with color. You can |
|
|
|
|
|
|||||||||||||
draw or fill plain rectangles, round-cornered rectangles, or three-dimensional rectangles. |
|
|
|
|
|
|||||||||||||
The drawRect(int x, int y, int w, int h) method draws a plain rectangle, and the |
drawRect |
|||||||||||||||||
fillRect(int x, int y, int w, int h) method draws a filled rectangle. The parameters |
fillRect |
|||||||||||||||||
x and y represent the upper-left corner of the rectangle, and w and h are its width and height |
|
|
|
|
|
|||||||||||||
(see Figure 15.7). |
|
|
|
|
|
|
|
|
|
|
||||||||
(x, y) |
(x, y) |
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
h |
|
|
|
|
|
|
|
|
h |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
(a) Plain rectangle |
|
|
(b) Filled rectangle |
|
|
|
|
|
FIGURE 15.7 (a) The drawRect(x, y, w, h) method draws a rectangle. (b) The fillRect(x, y, w, h) method draws a filled rectangle.
The drawRoundRect(int x, int y, int w, int h, int aw, int ah) method draws a |
drawRoundRect |
round-cornered rectangle, and the fillRoundRect(int x, int y, int w, int h, int aw, |
fillRoundRect |
int ah) method draws a filled round-cornered rectangle. Parameters x, y, w, and h are the |
|
same as in the drawRect method, parameter aw is the horizontal diameter of the arcs at the |
|