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

502 Chapter 15 Graphics

corner, and ah is the vertical diameter of the arcs at the corner (see Figure 15.8(a)). In other words, aw and ah are the width and the height of the oval that produces a quarter-circle at each corner.

 

 

aw/2

 

 

 

 

 

 

 

 

 

 

 

(x, y)

 

 

 

(x, y)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ah/2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h

 

 

 

 

 

 

 

h

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

(a) drawRoundRect

 

 

(b)

drawOval

 

FIGURE 15.8 (a) The drawRoundRect(x, y, w, h, aw, ah) method draws a round-

 

cornered rectangle. (b) The drawOval(x, y, w, h) method draws an oval based on its

 

bounding rectangle.

 

 

 

 

 

 

 

 

 

 

draw3DRect

The draw3DRect(int x, int y, int w, int h, boolean raised) method draws a

fill3DRect

3D rectangle and the fill3DRect(int x, int y, int

w, int h, boolean raised)

 

method draws a filled 3D rectangle. The parameters x, y, w, and h are the same as in the

 

drawRect method. The last parameter, a Boolean value, indicates whether the rectangle is

 

raised above the surface or sunk into the surface.

 

 

 

 

 

 

 

 

 

 

 

Depending on whether you wish to draw an oval in outline or filled solid, you can use

drawOval

either the drawOval(int x, int y, int w, int h) method or the fillOval(int x, int

fillOval

y, int w, int h) method. An oval is drawn based on its bounding rectangle. Parameters x

 

and y indicate the top-left corner of the bounding rectangle, and w and h indicate the width

 

and height, respectively, of the bounding rectangle, as shown in Figure 15.8(b).

Video Note

The FigurePanel class

create figures

15.5 Case Study: The FigurePanel Class

This example develops a useful class for displaying various figures. The class enables the user to set the figure type and specify whether the figure is filled, and it displays the figure on a panel. The UML diagram for the class is shown in Figure 15.9. The panel can display lines, rectangles, round-cornered rectangles, and ovals. Which figure to display is decided by the type property. If the filled property is true, the rectangle, round-cornered rectangle, and oval are filled in the panel.

The UML diagram serves as the contract for the FigurePanel class. The user can use the class without knowing how the class is implemented. Let us begin by writing a program in Listing 15.2 that uses the class to display six figure panels, as shown in Figure 15.10.

LISTING 15.2 TestFigurePanel.java

1 import java.awt.*;

2 import javax.swing.*;

3

4 public class TestFigurePanel extends JFrame {

5public TestFigurePanel() {

6 setLayout(new GridLayout(2, 3, 5, 5));

7add(new FigurePanel(FigurePanel.LINE));

8add(new FigurePanel(FigurePanel.RECTANGLE));

9 add(new FigurePanel(FigurePanel.ROUND_RECTANGLE));

10add(new FigurePanel(FigurePanel.OVAL));

11add(new FigurePanel(FigurePanel.RECTANGLE, true));

15.5 Case Study: The FigurePanel Class 503

12add(new FigurePanel(FigurePanel.ROUND_RECTANGLE, true));

13}

14

15public static void main(String[] args) {

16TestFigurePanel frame = new TestFigurePanel();

17frame.setSize(400, 200);

18frame.setTitle("TestFigurePanel");

19frame.setLocationRelativeTo(null); // Center the frame

20frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

21frame.setVisible(true);

22}

23}

javax.swing.JPanel

FigurePanel

+LINE = 1 +RECTANGLE = 2

+ROUND_RECTANGLE = 3 +OVAL = 4

-type: int -filled: boolean

+FigurePanel() +FigurePanel(type: int)

+FigurePanel(type: int, filled: boolean) +getType(): int

+setType(type: int): void +isFilled(): boolean +setFilled(filled: boolean): void

LINE, RECTANGLE, ROUND_RECTANGLE, and OVAL are constants, indicating the figure type.

Specifies the figure type (default: 1).

Specifies whether the figure is filled (default: false).

Creates a default figure panel.

Creates a figure panel with the specified type.

Creates a figure panel with the specified type and filled property. Returns the figure type.

Sets a new figure type.

Checks whether the figure is filled with a color.

Sets a new filled property.

FIGURE 15.9 FigurePanel displays various types of figures on the panel.

FIGURE 15.10 Six FigurePanel objects are created to display six figures.

The FigurePanel class is implemented in Listing 15.3. Four constants—LINE, RECTANGLE, ROUND_RECTANGLE, and OVAL—are declared in lines 6–9. Four types of figures are drawn according to the type property (line 37). The setColor method (lines 39, 44, 53, 62) sets a new color for the drawing.

LISTING 15.3 FigurePanel.java

1 import java.awt.*;

2 import javax.swing.JPanel;

3

4 public class FigurePanel extends JPanel {

504 Chapter 15

Graphics

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

// Define constants

constants

6

public static final int LINE = 1;

 

7

public static final int RECTANGLE = 2;

 

8

public static final int ROUND_RECTANGLE = 3;

 

9

public static final int OVAL = 4;

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11

private int type = 1;

 

12

private boolean filled = false;

 

13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

/** Construct a default FigurePanel */

 

15

public FigurePanel() {

 

16

}

 

 

 

 

 

 

 

 

 

 

 

 

 

17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

18

/** Construct a FigurePanel with the specified type */

 

19

public FigurePanel(int type) {

 

20

this.type = type;

 

21

}

 

 

 

 

 

 

 

 

 

 

 

 

 

22

 

 

 

 

 

 

 

 

 

 

 

 

 

 

23

/** Construct a FigurePanel with the specified type and filled */

 

24

public FigurePanel(int type, boolean filled) {

 

25

this.type = type;

 

26

this.filled = filled;

 

27

}

 

 

 

 

 

 

 

 

 

 

 

 

 

28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

29

/** Draw a figure on the panel */

override

30

protected void paintComponent(Graphics g) {

paintComponent(g)

31

super.paintComponent(g);

 

32

 

 

 

 

 

 

 

 

 

 

 

 

 

 

33

// Get the appropriate size for the figure

 

34

int width = getWidth();

 

35

int height = getHeight();

 

36

 

 

 

 

 

 

 

 

 

 

 

 

 

check type

37

 

switch (type)

{

 

38

 

case LINE: // Display two cross lines

 

39

 

 

g.setColor(Color.BLACK);

 

draw lines

40

 

 

g.drawLine(

10, 10, width - 10, height - 10);

 

41

 

 

g.drawLine(width - 10, 10, 10, height - 10);

 

42

 

break;

 

43

 

case RECTANGLE: // Display a rectangle

 

44

 

g.setColor(Color.BLUE);

 

45

 

 

if (filled)

 

 

fill a rectangle

46

 

 

 

g.fillRect((

int)(0.1 * width), (int)(0.1 * height),

 

47

 

 

 

(int)(0.8 * width), (int)(0.8 * height));

 

48

 

else

draw a rectangle

49

 

 

 

g.drawRect((

int)(0.1 * width), (int)(0.1 * height),

 

50

 

 

 

(int)(0.8 * width), (int)(0.8 * height));

 

51

 

break;

 

52

 

case ROUND_RECTANGLE: // Display a round-cornered rectangle

 

53

 

g.setColor(Color.RED);

 

54

 

 

if (filled)

 

 

 

fill round-cornered rect

55

 

 

 

g.fillRoundRect((

int)(0.1 * width), (int)(0.1 * height),

 

56

 

 

 

(int)(0.8 * width), (int)(0.8 * height), 20, 20);

 

57

 

else

draw round-cornered rect

58

 

 

 

g.drawRoundRect

((int)(0.1 * width), (int)(0.1 * height),

 

59

 

 

 

(int)(0.8 * width), (int)(0.8 * height), 20, 20);

 

60

 

break;

 

61

 

case OVAL: // Display an oval

 

62

 

g.setColor(Color.BLACK);

 

63

 

 

if (filled)

 

 

 

 

 

fill an oval

64

 

 

 

g.fillOval((

int)(0.1 * width), (int)(0.1 * height),

15.5 Case Study: The FigurePanel Class 505

65(int)(0.8 * width), (int)(0.8 * height));

66else

67

g.drawOval((int)(0.1 * width), (int)(0.1 * height),

draw an oval

68(int)(0.8 * width), (int)(0.8 * height));

69}

70}

71

72/** Set a new figure type */

73public void setType(int type) {

74this.type = type;

75

repaint();

repaint panel

76

}

 

77

 

 

78/** Return figure type */

79public int getType() {

80return type;

81}

82

83/** Set a new filled property */

84public void setFilled(boolean filled) {

85this.filled = filled;

86

repaint();

repaint panel

87

}

 

88

 

 

89/** Check if the figure is filled */

90public boolean isFilled() {

91return filled;

92}

93

 

 

 

 

94

/** Specify preferred size */

 

95

public Dimension getPreferredSize() {

override

96

 

return new Dimension(80, 80);

 

getPreferredSize()

97}

98}

The repaint method (lines 75, 86) is defined in the Component class. Invoking repaint causes the paintComponent method to be called. The repaint method is invoked to refresh the viewing area. Typically, you call it if you have new things to display.

Caution

The paintComponent method should never be invoked directly. It is invoked either by the JVM whenever the viewing area changes or by the repaint method. You should override the paintComponent method to tell the system how to paint the viewing area, but never override the repaint method.

don’t invoke paintComponent

Note

The repaint method lodges a request to update the viewing area and returns immediately. Its effect is asynchronous, meaning that it is up to the JVM to execute the paintComponent method on a separate thread.

The getPreferredSize() method (lines 95–97), defined in Component, is overridden in FigurePanel to specify the preferred size for the layout manager to consider when laying out a FigurePanel object. This property may or may not be considered by the layout manager, depending on its rules. For example, a component uses its preferred size in a container with a FlowLayout manager, but its preferred size may be ignored if it is placed in a container with a GridLayout manager. It is a good practice to override getPreferredSize() in a subclass of JPanel to specify a preferred size, because the default preferred size for a

JPanel is 0 by 0.

request repaint using repaint()

getPreferedSize()

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