Step By Step(Java 2D图形篇<一>) (二)

2014-11-24 03:21:36 · 作者: · 浏览: 14
g.drawString("Good: ", 10, GOOD_Y + 30);

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