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