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_CAR_WIDTH;
018:       height = DEFAULT_CAR_HEIGHT;      
019:    }
020: 
021:    /**
022:       Sets the x property.
023:       @param newValue the new x position
024:    */
025:    public void setX(int newValue)
026:    {
027:       x = newValue;
028:       repaint();
029:    }
030: 
031:    /**
032:       Gets the x property.
033:       @return the x position
034:    */
035:    public int getX()
036:    {
037:       return x;
038:    }
039: 
040:    /**
041:       Sets the y property.
042:       @param newValue the new y position
043:    */
044:    public void setY(int newValue)
045:    {
046:       y = newValue;
047:       repaint();
048:    }
049: 
050:    /**
051:       Gets the y property.
052:       @return the y position
053:    */
054:    public int getY()
055:    {
056:       return y;
057:    }
058: 
059:    public void paintComponent(Graphics g)
060:    {
061:       super.paintComponent(g);
062:       Graphics2D g2 = (Graphics2D) g;
063:       Rectangle2D.Double body
064:          = new Rectangle2D.Double(x, y + height / 3, 
065:             width - 1, height / 3);
066:       Ellipse2D.Double frontTire
067:          = new Ellipse2D.Double(x + width / 6, 
068:             y + height * 2 / 3, height / 3, height / 3);
069:       Ellipse2D.Double rearTire
070:          = new Ellipse2D.Double(x + width * 2 / 3, 
071:             y + height * 2 / 3, height / 3, height / 3);
072: 
073:       // the bottom of the front windshield
074:       Point2D.Double r1
075:          = new Point2D.Double(x + width / 6, y + height / 3);
076:       // the front of the roof
077:       Point2D.Double r2
078:          = new Point2D.Double(x + width / 3, y);
079:       // the rear of the roof
080:       Point2D.Double r3
081:          = new Point2D.Double(x + width * 2 / 3, y);
082:       // the bottom of the rear windshield
083:       Point2D.Double r4
084:          = new Point2D.Double(x + width * 5 / 6, y + height / 3);
085: 
086:       Line2D.Double frontWindshield
087:          = new Line2D.Double(r1, r2);
088:       Line2D.Double roofTop
089:          = new Line2D.Double(r2, r3);
090:       Line2D.Double rearWindshield
091:          = new Line2D.Double(r3, r4);
092: 
093:       g2.draw(body);
094:       g2.draw(frontTire);
095:       g2.draw(rearTire);
096:       g2.draw(frontWindshield);
097:       g2.draw(roofTop);
098:       g2.draw(rearWindshield);
099:    }
100: 
101:    public Dimension getPreferredSize() 
102:    { 
103:       return new Dimension(DEFAULT_PANEL_WIDTH, 
104:          DEFAULT_PANEL_HEIGHT);
105:    }
106: 
107:    private int x;
108:    private int y;
109:    private int width;
110:    private int height;
111:    
112:    private static final int DEFAULT_CAR_WIDTH = 60;
113:    private static final int DEFAULT_CAR_HEIGHT = 30;
114:    private static final int DEFAULT_PANEL_WIDTH = 160;
115:    private static final int DEFAULT_PANEL_HEIGHT = 130;
116: }