Contents:
CarMover.java
import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; /** A program that allows users to move a car with the mouse. */ public class CarMover extends JApplet { public CarPanel panel; public void init() { panel = new CarPanel(); getContentPane().add(panel); } public void start() { } public void stop() { } public static void main(String[] args) { final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 400; JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container contentPane = frame.getContentPane(); contentPane.add(new CarPanel()); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setVisible(true); } }
CarPanel.java
import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import javax.swing.*; import java.util.*; /** A panel that shows a scene composed of items. */ public class CarPanel extends JPanel { public CarPanel() { car = new CarShape(20, 20, 50); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent event) { mousePoint = event.getPoint(); if (!car.contains(mousePoint)) mousePoint = null; } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent event) { if (mousePoint == null) return; Point lastMousePoint = mousePoint; mousePoint = event.getPoint(); car.translate( mousePoint.getX() - lastMousePoint.getX(), mousePoint.getY() - lastMousePoint.getY()); repaint(); } }); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; car.draw(g2); } private CarShape car; private Point mousePoint; }
CarShape.java
import java.awt.*; import java.awt.geom.*; /** A car shape. */ public class CarShape { /** Constructs a car shape. @param x the left of the bounding rectangle @param y the top of the bounding rectangle @param width the width of the bounding rectangle */ public CarShape(int x, int y, int width) { this.x = x; this.y = y; this.width = width; } public void draw(Graphics2D g2) { Rectangle2D.Double body = new Rectangle2D.Double(x, y + width / 6, width - 1, width / 6); Ellipse2D.Double frontTire = new Ellipse2D.Double(x + width / 6, y + width / 3, width / 6, width / 6); Ellipse2D.Double rearTire = new Ellipse2D.Double(x + width * 2 / 3, y + width / 3, width / 6, width / 6); // the bottom of the front windshield Point2D.Double r1 = new Point2D.Double(x + width / 6, y + width / 6); // the front of the roof Point2D.Double r2 = new Point2D.Double(x + width / 3, y); // the rear of the roof Point2D.Double r3 = new Point2D.Double(x + width * 2 / 3, y); // the bottom of the rear windshield Point2D.Double r4 = new Point2D.Double(x + width * 5 / 6, y + width / 6); Line2D.Double frontWindshield = new Line2D.Double(r1, r2); Line2D.Double roofTop = new Line2D.Double(r2, r3); Line2D.Double rearWindshield = new Line2D.Double(r3, r4); g2.draw(body); g2.draw(frontTire); g2.draw(rearTire); g2.draw(frontWindshield); g2.draw(roofTop); g2.draw(rearWindshield); } public boolean contains(Point2D p) { return x <= p.getX() && p.getX() <= x + width && y <= p.getY() && p.getY() <= y + width / 2; } public void translate(double dx, double dy) { x += dx; y += dy; } private int x; private int y; private int width; }
Maintained by John Loomis, updated Sun Feb 25 23:14:03 2007