18 // Bad line
19 Shape line = new Line2D.Double(LINE_X, BAD_Y, LINE_X + 50, BAD_Y + 50);
20 startTime = System.nanoTime();
21 for (int i = 0; i < ITERATIONS; ++i) {
22 g2d.draw(line);
23 }
24 endTime = System.nanoTime();
25 totalTime = (endTime - startTime) / 1000000;
26 System.out.println("bad line = " + totalTime);
27 g.drawString(totalTime + " ms", LINE_X, BAD_Y + 70);
28
29 // Good line
30 startTime = System.nanoTime();
31 for (int i = 0; i < ITERATIONS; ++i) {
32 g.drawLine(LINE_X, GOOD_Y, LINE_X + 50, GOOD_Y + 50);
33 }
34 endTime = System.nanoTime();
35 totalTime = (endTime - startTime) / 1000000;
36 System.out.println("good line = " + totalTime);
37 g.drawString(totalTime + " ms", LINE_X, GOOD_Y + 70);
38 // Bad rect
39 Shape rect = new Rectangle(RECT_X, BAD_Y, 50, 50);
40 startTime = System.nanoTime();
41 for (int i = 0; i < ITERATIONS; ++i) {
42 g2d.fill(rect);
43 }
44 endTime = System.nanoTime();
45 totalTime = (endTime - startTime) / 1000000;
46 System.out.println("bad rect = " + totalTime);
47 g.drawString(totalTime + " ms", RECT_X, BAD_Y + 70);
48
49 // Good rect
50 startTime = System.nanoTime();
51 for (int i = 0; i < ITERATIONS; ++i) {
52 g.fillRect(RECT_X, GOOD_Y, 50, 50);
53 }
54 endTime = System.nanoTime();
55 totalTime = (endTime - startTime) / 1000000;
56 System.out.println("good rect = " + totalTime);
57 g.drawString(totalTime + " ms", RECT_X, GOOD_Y + 70);
58 }
在组件的paintComponent方法中直接调用该方法可以看到运行结果。
2) 绘制Ellipse2D和RoundRectangle2D:
1 public class MyTest extends JPanel {
2 public static void main(String args[]) {
3 JFrame f = new JFrame("Ellipse and RoundRectangle");
4 f.setSize(360, 300);
5 f.add(new MyTest());
6 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
7 f.setLocationRelativeTo(null);
8 f.setVisible(true);
9 }
10 public MyTest() {
11 setBackground(Color.white);
12 setForeground(Color.white);
13 }
14 @Override
15 public void paintComponent(Graphics g) {
16 super.paintComponent(g);
17 g.setColor(Color.red);
18 paintOval(g);
19 paintRoundRectangle(g);
20 }
21 //绘制一个椭圆
22 private void paintOval(Graphics g) {
23 Graphics2D g2 = (Graphics2D)g;
24 g2.draw(new Ellipse2D.Float(5, 15, 50, 75));
25 }
26 //绘制一个圆形边角的矩形
27 private void paintRoundRectangle(Graphics g) {
28 Graphics2D g2 = (Graphics2D)g;
29 RoundRectangle2D rr = new RoundRectangle2D.Float(100, 10, 80, 30, 15, 15);
30 //获取当前的Color属性并保存到临时变量中,更新该属性,在使用完之后,
31 //用该临时变量恢复到原有的Color属性,这种方式是比较通用的一种技巧。
32 //在很多其他的类库中也会经常被用到。
33 Color oldColor = g2.getColor();
34 g2.setColor(Color.blue);
35 g2.fill(rr);
36 g2.setColor(oldColor);
37 }
38 }
3) 绘制园(drawOval)和