    001: import java.awt.*;
    002: import java.awt.geom.*;
    003: import javax.swing.*;
    004:
    005: /**
    006:    A panel that draws a car shape.
    007: */
    008: public class CarBean extends JPanel
    009: {
    010:    /**
    011:       Constructs a default car bean.
    012:    */
    013:    public CarBean()
    014:    {
    015:       x = 0;
    016:       y = 0;
    017:       width = DEFAULT_WIDTH;
    018:       height = DEFAULT_HEIGHT;
    019:       color = DEFAULT_COLOR;
    020:       fill = false;
    021:    }
    022:
    023:    /**
    024:       Sets the color property.
    025:       @param color the new color
    026:    */
    027:    public void setColor(Color color)
    028:    {
    029:       this.color = color;
    030:       repaint();
    031:    }
    032:
    033:    /**
    034:       Gets the color property.
    035:       @return the current color
    036:    */
    037:    public Color getColor() { return color; }
    038:
    039:    /**
    040:       Sets the dimension property.
    041:       @param dimension the new dimension of the house
    042:    */
    043:    public void setDimension(Dimension dimension)
    044:    {
    045:       width = (int) dimension.getWidth();
    046:       height = (int) dimension.getHeight();
    047:       repaint();
    048:    }
    049:
    050:    /**
    051:       Gets the dimension property.
    052:       @return the current dimension of the house
    053:    */
    054:    public Dimension getDimension()
    055:    {
    056:       return new Dimension(width, height);
    057:    }
    058:
    059:    /**
    060:       Sets the drawMode property.
    061:       @param drawMode the new drawMode (DRAW or FILL)
    062:    */
    063:    public void setDrawMode(DrawMode drawMode)
    064:    {
    065:       if (drawMode == DrawMode.DRAW)
    066:       {
    067:          fill = false;
    068:          repaint();
    069:       }
    070:       else if (drawMode == DrawMode.FILL)
    071:       {
    072:          fill = true;
    073:          repaint();
    074:       }
    075:    }
    076:
    077:    /**
    078:       Gets the drawMode property.
    079:       @return the current drawMode (DRAW or FILL)
    080:    */
    081:    public DrawMode getDrawMode()
    082:    {
    083:       if (fill) return DrawMode.FILL;
    084:       else return DrawMode.DRAW;
    085:    }
    086:
    087:    public void paintComponent(Graphics g)
    088:    {
    089:       super.paintComponent(g);
    090:       Graphics2D g2 = (Graphics2D) g;
    091:       Rectangle2D.Double body
    092:          = new Rectangle2D.Double(x, y + height / 3,
    093:             width - 1, height / 3);
    094:       Ellipse2D.Double frontTire
    095:          = new Ellipse2D.Double(x + width / 6,
    096:             y + height * 2 / 3, height / 3, height / 3);
    097:       Ellipse2D.Double rearTire
    098:          = new Ellipse2D.Double(x + width * 2 / 3,
    099:             y + height * 2 / 3, height / 3, height / 3);
    100:
    101:       // the bottom of the front windshield
    102:       Point2D.Double r1
    103:          = new Point2D.Double(x + width / 6, y + height / 3);
    104:       // the front of the roof
    105:       Point2D.Double r2
    106:          = new Point2D.Double(x + width / 3, y);
    107:       // the rear of the roof
    108:       Point2D.Double r3
    109:          = new Point2D.Double(x + width * 2 / 3, y);
    110:       // the bottom of the rear windshield
    111:       Point2D.Double r4
    112:          = new Point2D.Double(x + width * 5 / 6, y + height / 3);
    113:       Line2D.Double frontWindshield
    114:          = new Line2D.Double(r1, r2);
    115:       Line2D.Double roofTop
    116:          = new Line2D.Double(r2, r3);
    117:       Line2D.Double rearWindshield
    118:          = new Line2D.Double(r3, r4);
    119:
    120:       g2.setColor(color);
    121:       if (fill)
    122:       {
    123:          g2.fill(body);
    124:          g2.fill(frontTire);
    125:          g2.fill(rearTire);
    126:       }
    127:       else
    128:       {
    129:          g2.draw(body);
    130:          g2.draw(frontTire);
    131:          g2.draw(rearTire);
    132:       }
    133:       g2.draw(frontWindshield);
    134:       g2.draw(roofTop);
    135:       g2.draw(rearWindshield);
    136:    }
    137:
    138:    public static final int DRAW = 0;
    139:    public static final int FILL = 1;
    140:
    141:    private int x;
    142:    private int y;
    143:    private Color color;
    144:    private int width;
    145:    private int height;
    146:    private boolean fill;
    147:
    148:    private static final int DEFAULT_WIDTH = 50;
    149:    private static final int DEFAULT_HEIGHT = 80;
    150:    private static final Color DEFAULT_COLOR = Color.BLACK;
    151: }