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

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

 

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