Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Intro_Java_brief_Liang2011.pdf
Скачиваний:
195
Добавлен:
26.03.2016
Размер:
10.44 Mб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]