- •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
516 Chapter 15 Graphics
override getPreferredSize
design classes for reuse
121repaint();
122}
123
124/** Move the message down */
125public void moveDown() {
126yCoordinate += interval;
127repaint();
128}
129
130/** Override get method for preferredSize */
131public Dimension getPreferredSize() {
132return new Dimension(200, 30);
133}
134}
The paintComponent method displays the message centered, if the centered property is true (line 91). message is initialized to ”Welcome to Java” in line 8. If it were not initialized, a NullPointerException runtime error would occur when you created a MessagePanel using the no-arg constructor, because message would be null in line 103.
Caution
The MessagePanel class uses the properties xCoordinate and yCoordinate to specify the position of the message displayed on the panel. Do not use the property names x and y, because they are already defined in the Component class to return the position of the component in the parent’s coordinate system using getX() and getY().
Note
The Component class has the setBackground, setForeground, and setFont methods. These methods are for setting colors and fonts for the entire component. Suppose you want to draw several messages in a panel with different colors and fonts; you have to use the setColor and setFont methods in the Graphics class to set the color and font for the current drawing.
Note
A key feature of Java programming is the reuse of classes. Throughout this book, reusable classes are developed and later reused. MessagePanel is an example, as are Loan in Listing 10.2 and FigurePanel in Listing 15.3. MessagePanel can be reused whenever you need to display a message on a panel. To make your class reusable in a wide range of applications, you should provide a variety of ways to use it. MessagePanel provides many properties and methods that will be used in several examples in the book. The next section presents a useful and reusable class for displaying a clock on a panel graphically.
Video Note
The StillClock class
15.10 Case Study: The StillClock Class
This case study develops a class that displays a clock on a panel. The contract of the class is shown in Figure 15.21.
Let us first write a test program in Listing 15.9 that uses the StillClock class to display an analog clock and uses the MessagePanel class to display the hour, minute, and second in a panel, as shown in Figure 15.22(a).
LISTING 15.9 DisplayClock.java
1 import java.awt.*;
2 import javax.swing.*;
3
4 public class DisplayClock extends JFrame {
5 public DisplayClock() {
15.10 Case Study: The StillClock Class 517
6// Create an analog clock for the current time
7 |
StillClock clock = new StillClock(); |
create a clock |
8 |
|
|
9// Display hour, minute, and second in the message panel
10 |
MessagePanel messagePanel = new MessagePanel(clock.getHour() + |
create a message panel |
11":" + clock.getMinute() + ":" + clock.getSecond());
12messagePanel.setCentered(true);
13messagePanel.setForeground(Color.blue);
14messagePanel.setFont(new Font("Courier", Font.BOLD, 16));
16// Add the clock and message panel to the frame
17 |
add(clock); |
add a clock |
18 |
add(messagePanel, BorderLayout.SOUTH); |
add a message panel |
19 |
} |
|
20 |
|
|
21public static void main(String[] args) {
22DisplayClock frame = new DisplayClock();
23frame.setTitle("DisplayClock");
24frame.setSize(300, 350);
25frame.setLocationRelativeTo(null); // Center the frame
26frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
27frame.setVisible(true);
28}
29}
javax.swing.JPanel |
|
|
|
|
The get and set methods for these |
|
|
|
|
|
data fields are provided in the class, but |
StillClock |
|
omitted in the UML diagram for brevity. |
|
|
|
|
|
|
-hour: int |
|
The hour in the clock. |
-minute: int |
|
The minute in the clock. |
-second: int |
|
The second in the clock. |
|
|
|
+StillClock() |
|
Constructs a default clock for the current time. |
+StillClock(hour: int, minute: int, |
|
Constructs a clock with a specified time. |
second: int) |
|
|
+setCurrentTime(): void |
|
Sets hour, minute, and second to current time. |
|
|
|
FIGURE 15.21 StillClock displays an analog clock.
The rest of this section explains how to implement the StillClock class. Since you can use the
class without knowing how it is implemented, you may skip the implementation if you wish. skip implementation? To draw a clock, you need to draw a circle and three hands for second, minute, and hour. implementation
To draw a hand, you need to specify the two ends of the line. As shown in Figure 15.22(b), one end is the center of the clock at (xCenter, yCenter); the other end, at (xEnd, yEnd), is determined by the following formula:
xEnd = xCenter + handLength × sin(θ) yEnd = yCenter - handLength × cos(θ)
Since there are 60 seconds in one minute, the angle for the second hand is
second × (2π/60)
518 Chapter 15 Graphics
(0, 0)
(xEnd, yEnd)
12
handLength
9 |
3 |
(xCenter, yCenter)
6
(a) |
(b) |
FIGURE 15.22 (a) The DisplayClock program displays a clock that shows the current time.
(b) The endpoint of a clock hand can be determined, given the spanning angle, the hand length, and the center point.
The position of the minute hand is determined by the minute and second. The exact minute value combined with seconds is minute + second/60. For example, if the time is 3 minutes and 30 seconds, the total minutes are 3.5. Since there are 60 minutes in one hour, the angle for the minute hand is
(minute + second/60) × (2π/60)
Since one circle is divided into 12 hours, the angle for the hour hand is
(hour + minute/60 + second/(60 × 60)) × (2π/12)
For simplicity in computing the angles of the minute hand and hour hand, you can omit the seconds, because they are negligibly small. Therefore, the endpoints for the second hand, minute hand, and hour hand can be computed as:
xSecond = xCenter + secondHandLength × sin(second × (2π/60)) ySecond = yCenter - secondHandLength × cos(second × (2π/60)) xMinute = xCenter + minuteHandLength × sin(minute × (2π/60)) yMinute = yCenter - minuteHandLength × cos(minute × (2π/60))
xHour = xCenter + hourHandLength × sin((hour + minute/60) × (2π/60)) yHour = yCenter - hourHandLength × cos((hour + minute/60) × (2π/60))
The StillClock class is implemented in Listing 15.10.
LISTING 15.10 StillClock.java
1 import java.awt.*;
2 import javax.swing.*;
3 import java.util.*;
4
5 public class StillClock extends JPanel {
6 private int hour;
7 private int minute;
8 private int second;
9
10/** Construct a default clock with the current time*/
11public StillClock() {
12setCurrentTime();
13}
14
15 /** Construct a clock with specified hour, minute, and second */
15.10 Case Study: The StillClock Class 519
16public StillClock(int hour, int minute, int second) {
17this.hour = hour;
18this.minute = minute;
19this.second = second;
20}
21
22/** Return hour */
23public int getHour() {
24return hour;
25}
26
27/** Set a new hour */
28public void setHour(int hour) {
29this.hour = hour;
30 |
repaint(); |
repaint panel |
31 |
} |
|
32 |
|
|
33/** Return minute */
34public int getMinute() {
35return minute;
36}
37
38/** Set a new minute */
39public void setMinute(int minute) {
40this.minute = minute;
41 |
repaint(); |
repaint panel |
42 |
} |
|
43 |
|
|
44/** Return second */
45public int getSecond() {
46return second;
47}
48
49/** Set a new second */
50public void setSecond(int second) {
51this.second = second;
52 |
repaint(); |
repaint panel |
53 |
} |
|
54 |
|
|
55 |
/** Draw the clock */ |
|
56 |
protected void paintComponent(Graphics g) { |
override paintComponent |
57 |
super.paintComponent(g); |
|
58 |
|
|
59// Initialize clock parameters
60int clockRadius =
61(int)(Math.min(getWidth(), getHeight()) * 0.8 * 0.5);
62int xCenter = getWidth() / 2;
63int yCenter = getHeight() / 2;
64
65// Draw circle
66g.setColor(Color.BLACK);
67g.drawOval(xCenter - clockRadius, yCenter - clockRadius,
682 * clockRadius, 2 * clockRadius);
69g.drawString("12", xCenter - 5, yCenter - clockRadius + 12);
70g.drawString("9", xCenter - clockRadius + 3, yCenter + 5);
71g.drawString("3", xCenter + clockRadius - 10, yCenter + 3);
72g.drawString("6", xCenter - 3, yCenter + clockRadius - 3);
74// Draw second hand
75int sLength = (int)(clockRadius * 0.8);