    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: