01: import java.awt.*;
02: import java.awt.geom.*;
03: import javax.swing.*;
04: 
05: /**
06:    An icon that has the shape of a car.
07: */
08: public class CarIcon implements Icon
09: {
10:    /**
11:       Constructs a car of a given width.
12:       @param width the width of the car
13:    */
14:    public CarIcon(int aWidth)
15:    {
16:       width = aWidth;
17:    }
18:    
19:    public int getIconWidth()
20:    {
21:       return width;
22:    }
23: 
24:    public int getIconHeight()
25:    {
26:       return width / 2;
27:    }
28: 
29:    public void paintIcon(Component c, Graphics g, int x, int y)
30:    {
31:       Graphics2D g2 = (Graphics2D) g;
32:       Rectangle2D.Double body
33:          = new Rectangle2D.Double(x, y + width / 6, 
34:             width - 1, width / 6);
35:       Ellipse2D.Double frontTire
36:          = new Ellipse2D.Double(x + width / 6, y + width / 3, 
37:             width / 6, width / 6);
38:       Ellipse2D.Double rearTire
39:          = new Ellipse2D.Double(x + width * 2 / 3, y + width / 3,
40:             width / 6, width / 6);
41: 
42:       // the bottom of the front windshield
43:       Point2D.Double r1
44:          = new Point2D.Double(x + width / 6, y + width / 6);
45:       // the front of the roof
46:       Point2D.Double r2
47:          = new Point2D.Double(x + width / 3, y);
48:       // the rear of the roof
49:       Point2D.Double r3
50:          = new Point2D.Double(x + width * 2 / 3, y);
51:       // the bottom of the rear windshield
52:       Point2D.Double r4
53:          = new Point2D.Double(x + width * 5 / 6, y + width / 6);
54: 
55:       Line2D.Double frontWindshield
56:          = new Line2D.Double(r1, r2);
57:       Line2D.Double roofTop
58:          = new Line2D.Double(r2, r3);
59:       Line2D.Double rearWindshield
60:          = new Line2D.Double(r3, r4);
61: 
62:       g2.fill(frontTire);
63:       g2.fill(rearTire);
64:       g2.setColor(Color.red);
65:       g2.fill(body);
66:       g2.draw(frontWindshield);
67:       g2.draw(roofTop);
68:       g2.draw(rearWindshield);
69:    }
70: 
71:    private int width;
72: }
73: 
74: