The following code snippet shows how to implement rubber-drawing with Java.

 import java.applet.*;
import java.awt.*;
import java.util.Vector;

public class SimpleCAD extends Applet {
    
    int w = 200;
    int h = 200;
    Vector lines = new Vector();
    int np = 0;
    int x1,y1;
    int x2,y2;
    int xl,yl;
    Image offImg;
    Graphics offGra;
    Button btnClear, btnUndo;
    
    public void init() {
        
        setLayout(new FlowLayout());
        btnClear = new Button("Clear");
        btnUndo = new Button("Undo");
        add(btnClear);
        add(btnUndo);
        setBackground(new Color(0).black);
        setForeground(new Color(0).white);
    }
    
    public void Dragupdate(Graphics g) {
    /*
     ** rubber-band effect
     */
        g.setXORMode(getBackground());
        setForeground(new Color(0).blue);
        if (xl != -1){
            // erase the old line
            g.drawLine(x1, y1, xl, yl);
            if (x2 != -1) {
                // draw the new one
                g.drawLine(x1, y1, x2, y2);
            }
        }
    }
    
    public void update(Graphics g) {
        
        // draw an offScreen drawing
        Dimension dim = getSize();
        if (offGra == null) {
            offImg = createImage(dim.width, dim.height);
            offGra = offImg.getGraphics();
        }
        offGra.setColor(new Color(0).black);
        offGra.fillRect(0,0,dim.width, dim.height);
        offGra.setColor(new Color(0).white);
        offGra.setPaintMode();
        for (int i=0; i < np; i++) {
            Rectangle p = (Rectangle)lines.elementAt(i);
            if (p.width != -1) {
                offGra.drawLine(p.x, p.y, p.width, p.height);
            }
        }
        // put the OffScreen image OnScreen
        g.drawImage(offImg,0,0,null);
    }
    
    public boolean handleEvent(Event e) {
        
        switch (e.id) {
            case Event.MOUSE_DOWN:
                // new starting point
                x1 = e.x;
                y1 = e.y;
                // begin an new drawing process
                x2 = -1;
                return true;
            case Event.MOUSE_UP:
                // end a drawing process
                lines.addElement(new Rectangle(x1, y1, e.x, e.y));
                np++;
                x2 = xl = -1;
                repaint();
                return true;
            case Event.MOUSE_DRAG:
                // xl yl line to be erased
                xl = x2;
                yl = y2;
                // x2 y2 last current point
                x2 = e.x;
                y2 = e.y;
                Dragupdate(getGraphics());
                return true;
        }
        return super.handleEvent(e);
    }
    
    public boolean action(Event e, Object o) {
        if (e.target == btnClear) resetDrawing();
        if (e.target == btnUndo)  undo();
        return true;
    }
    
    public void undo() {
        if (np>0) {
            lines.removeElementAt(np-1);
            np--;
            repaint();
        }
    }
    
    public void resetDrawing() {
        lines.removeAllElements();
        np=0;
        repaint();
    }
}