import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class PaintPanel extends JPanel implements MouseMotionListener { /* static class variables to determine shapes */ public static int LINE = 0; public static int RECTANGLE = 1; public static int OVAL = 2; private boolean filledShape = true; private int shape = 1; // default is rectangle private int startX; private int startY; private int stopX; private int stopY; private Color paintColor; private boolean mousePressed; private PaintShape tempShape; private Vector storedShapes; public PaintPanel() { super(true); // being double buffered paintColor = Color.black; storedShapes = new Vector(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent mp) { if ((mp.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { startX = mp.getX(); startY = mp.getY(); mousePressed = true; } } public void mouseReleased(MouseEvent mr) { if ((mr.getModifiers() & InputEvent.BUTTON1_MASK) != 0) { mousePressed = false; stopX = mr.getX(); stopY = mr.getY(); tempShape = new PaintShape(filledShape, paintColor, shape, startX, startY); tempShape.setStop(stopX, stopY); storedShapes.addElement(tempShape); repaint(); } } public void mouseClicked(MouseEvent mc) { if (mc.getClickCount() > 1 && (mc.getModifiers() & InputEvent.BUTTON3_MASK) != 0) { Point p = new Point(mc.getX(), mc.getY()); removeShape(p); } } }); addMouseMotionListener(this); } private void removeShape(Point xy) { for (int i = 0; i < storedShapes.size(); i++) { PaintShape tempS = (PaintShape) storedShapes.elementAt(i); if (tempS.contains(xy)) { storedShapes.removeElement(tempS); repaint(); break; } } } public void mouseMoved(MouseEvent skipIt) { /* empty */ } public void mouseDragged(MouseEvent me) { stopX = me.getX(); stopY = me.getY(); repaint(); } public void paintComponent(Graphics g) { super.paintComponent(g); for(int i = 0; i < storedShapes.size(); i++) { PaintShape tempObj = (PaintShape)storedShapes.elementAt(i); tempObj.paintComponent(g); } Color oldColor = g.getColor(); g.setColor(paintColor); if (shape == 0) { // that is line g.drawLine(startX, startY, stopX, stopY); } else { /* make four temp variables to avoid trouble */ int startXX = startX; int startYY = startY; int width = stopX - startX; int height = stopY - startY; if (width < 0) { // not good startXX = stopX; width = -width; } else { startXX = startX; } if (height < 0) { // not good startYY = stopY; height = -height; } else { startYY = startY; } if (shape == 1) { // that is rectangle if (filledShape) { g.fillRect(startXX, startYY, width, height); } else { g.drawRect(startXX, startYY, width, height); } } else { // remaining is oval if (mousePressed) { g.drawRect(startXX, startYY, width, height); } if (filledShape) { g.fillOval(startXX, startYY, width, height); } else { g.drawOval(startXX, startYY, width, height); } } } g.setColor(oldColor); } public void setFilled(boolean b) { filledShape = b; } public void setShape(int sh) { shape = sh; } public void setColor(Color c) { paintColor = c; } }