001: import java.awt.*; 002: import java.awt.geom.*; 003: import java.io.*; 004: 005: /** 006: A serializable car shape. 007: */ 008: public class Car implements Serializable 009: { 010: /** 011: Constructs a car. 012: @param x the left of the bounding rectangle 013: @param y the top of the bounding rectangle 014: @param width the width of the bounding rectangle 015: */ 016: public Car(int x, int y, int width) 017: { 018: body = new Rectangle(x, y + width / 6, 019: width - 1, width / 6); 020: roof = new Rectangle(x + width / 3, y, 021: width / 3, width / 6); 022: frontTire = new Ellipse2D.Double(x + width / 6, y + width / 3, 023: width / 6, width / 6); 024: rearTire = new Ellipse2D.Double(x + width * 2 / 3, y + width / 3, 025: width / 6, width / 6); 026: } 027: 028: private void writeObject(ObjectOutputStream out) 029: throws IOException 030: { 031: out.defaultWriteObject(); 032: writeRectangularShape(out, frontTire); 033: writeRectangularShape(out, rearTire); 034: } 035: 036: /** 037: A helper method to write a rectangular shape. 038: @param out the stream onto which to write the shape 039: @param s the shape to write 040: */ 041: private static void writeRectangularShape(ObjectOutputStream out, 042: RectangularShape s) 043: throws IOException 044: { 045: out.writeDouble(s.getX()); 046: out.writeDouble(s.getY()); 047: out.writeDouble(s.getWidth()); 048: out.writeDouble(s.getHeight()); 049: } 050: 051: private void readObject(ObjectInputStream in) 052: throws IOException, ClassNotFoundException 053: { 054: in.defaultReadObject(); 055: frontTire = new Ellipse2D.Double(); 056: readRectangularShape(in, frontTire); 057: rearTire = new Ellipse2D.Double(); 058: readRectangularShape(in, rearTire); 059: } 060: 061: /** 062: A helper method to read a rectangular shape. 063: @param in the stream from which to read the shape 064: @param s the shape to read. The method sets the frame 065: of this rectangular shape. 066: */ 067: private static void readRectangularShape(ObjectInputStream in, 068: RectangularShape s) 069: throws IOException 070: { 071: double x = in.readDouble(); 072: double y = in.readDouble(); 073: double width = in.readDouble(); 074: double height = in.readDouble(); 075: s.setFrame(x, y, width, height); 076: } 077: 078: /** 079: Draws the car. 080: @param g2 the graphics context 081: */ 082: public void draw(Graphics2D g2) 083: { 084: g2.draw(body); 085: g2.draw(roof); 086: g2.draw(frontTire); 087: g2.draw(rearTire); 088: } 089: 090: public String toString() 091: { 092: return getClass().getName() 093: + "[body=" + body 094: + ",roof=" + roof 095: + ",frontTire=" + formatRectangularShape(frontTire) 096: + ",rearTire=" + formatRectangularShape(rearTire) 097: + "]"; 098: } 099: 100: /** 101: A helper method to format a rectangular shape. 102: @param s the shape to format 103: @return a formatted representation of the given shape 104: */ 105: private static String formatRectangularShape(RectangularShape s) 106: { 107: return s.getClass().getName() 108: + "[x=" + s.getX() 109: + ",y=" + s.getY() 110: + ",width=" + s.getWidth() 111: + ",height=" + s.getHeight() 112: + "]"; 113: } 114: 115: 116: private Rectangle body; 117: private Rectangle roof; 118: private transient Ellipse2D.Double frontTire; 119: private transient Ellipse2D.Double rearTire; 120: } 121: 122: