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

2014-11-24 03:21:36 · 作者: · 浏览: 2
Graphics2D g2 = (Graphics2D) g;

42 GeneralPath s = new GeneralPath();

43 s.moveTo((float) points[0].getX(), (float) points[0].getY());

44 for (int i = 1; i < points.length; i++)

45 s.lineTo((float) points[i].getX(), (float) points[i].getY());

46 s.closePath();

47 g2.draw(s);

48 }

49 }

5) 绘制Rectangle的3D边框:

可以想象一下Swing中的JButton控件,在缺省属性下,其显示效果为有凸出感的Rectangle。该效果在技术上的实现还是比较简单和通用的,见下例:

1 public class MyTest extends JPanel {

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

3 JFrame f = new JFrame("3D Rect");

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 paint3DRect(g);

19 }

20 // 绘制和填充3D效果的Rectangle边框

21 private void paint3DRect(Graphics g) {

22 int thickness = 4;

23 //draw3DRect和fill3DRect函数的最后一个参数决定绘制的

24 //3D效果是raised还是sunk,我们常见的button控件的3D效

25 //果是raised。如果最后一个参数是true,则为raised。

26 g.fill3DRect(200, 10, 80, 30, true);

27 for (int i = 1; i <= thickness; i++)

28 g.draw3DRect(200 - i, 10 - i, 80 + 2 * i - 1, 30 + 2 * i - 1, true);

29

30 g.fill3DRect(200, 50, 80, 30, false);

31 for (int i = 1; i <= thickness; i++)

32 g.draw3DRect(200 - i, 50 - i, 80 + 2 * i - 1, 30 + 2 * i - 1, true);

33 }

34 }

6) 绘制二次曲线和三次曲线:

该示例代码中,左侧显示的是二次曲线,右侧显示的是三次曲线,中间用黑色的分隔线分隔。

1 public class MyTest extends JPanel {

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

3 JFrame f = new JFrame("Curve Demo");

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 paintQuadCurve(g);

18 //画分割线,其中左边是二次曲线,右边是三次曲线

19 int x = getWidth() / 2;

20 g.setColor(Color.BLACK);

21 g.drawLine(x, 0, x, getHeight());

22 paintCubicCurve(g);

23 }

24 // 绘制二次曲线

25 private void paintQuadCurve(Graphics g) {

26 Random generator = new Random();

27 Point2D[] points = new Point2D[3];

28 //二次曲线的x坐标均小于getWidth()/2,因此可以显示在JPanel左侧。

29 for (int i = 0; i < 3; i++) {

30 double x = generator.nextDouble() * getWidth() / 2;

31 double y = generator.nextDouble() * getHeight();

32 points[i] = new Point2D.Double(x, y);

33 }

34 g.setColo