Multiple shapes when drawing via Mousedragged
<p>I need to some help about drawing shapes with java graphics...,I'm trying to create paint application and when I using mousedragged its drawing multiple shapes (from small to large);like this : <a href="http://i.stack.imgur.com/0oQmv.png" rel="nofollow">http://i.stack.imgur.com/0oQmv.png</a> </p>

<p>Anyone can solve this issue ?
<strong><em>THANKS FOR ALL..</em></strong></p>

<blockquote>
  <p>This is <strong><em>DrawingArea</em></strong> class : </p>
</blockquote>

<pre><code>    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.RenderingHints;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.image.RenderedImage;
    import java.io.File;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JColorChooser;
    import javax.swing.JComponent;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JSlider;
    import say.swing.JFontChooser;
    public class DrawingArea extends JComponent implements MouseListener,MouseMotionListener {

    /**
     * 
     */
    Shapers shape;//IMPORTED FROM SHAPERS CLASS TO USE THE ENUMS.
    private Font myFont; 
    private Image image;
    private Graphics2D g2;
    private static final long serialVersionUID = 1L;
    private Color currentColor, initialColor = Color.BLACK;
    private int oldX, oldY, lastX, lastY, draggedX, draggedY, width, height, x, y, thickness = 3;

    public DrawingArea() { //ADDING LISTENERS FOR JCOMPONENTS.
        setDoubleBuffered(false);
        addMouseMotionListener(this);
        addMouseListener(this);
    }
    //PENCIL OR ERASER STROKE SETTED BY JSLIDER
    public void setStroke(JSlider slider) {thickness = slider.getValue();}
    //FOR CHOOSING COLOR FROM COLOR CHOOSER
    public void ChooseColor() { currentColor = JColorChooser.showDialog(this, "Choose Your Color", initialColor);}
    //CHOOSING FONT FROM FONTCHOOSER (EXTERNAL LIBRARY).
    public void ChooseFont() {

        JFontChooser chooseFont = new JFontChooser();
        int results = chooseFont.showDialog(this);
        if (results == JFontChooser.OK_OPTION) {
            myFont = chooseFont.getSelectedFont();
        }
    }
    @Override//GETTING FIRST (STARTING) COORDINATE WHEN THE MOUSE PRESSED
    public void mousePressed(MouseEvent e) {
        oldX = e.getX();
        oldY = e.getY();
        repaint();
    if(shape == Shapers.TEXT){ //DRAWING TEXT (FONT,SIZE AND COLOR ENABLED).
            String str = JOptionPane.showInputDialog("Write Your Text Here : ");
            g2.setFont(myFont);
            g2.setColor(currentColor);
            g2.drawString(str, oldX, oldY);
        }
    }

    @Override//GETTING RELEASED COORDINATE TO DRAW LINE.
    public void mouseReleased(MouseEvent e) {
        lastX = e.getX();
        lastY = e.getY();
    }
    //GETTING COORDINATE TO DRAW FILLEDRECT,FILLEDOVAL,OVAL,RECT.
    public void mouseDragged(MouseEvent e) {
        draggedX = e.getX();
        draggedY = e.getY();
        repaint();
        width = Math.abs(oldX - draggedX);
        height = Math.abs(oldY - draggedY);
        x = Math.min(draggedX, oldX);
        y = Math.min(draggedY, oldY);
    }

    public void mouseMoved(MouseEvent e) {}

    public void mouseClicked(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}
    //CLEAR THE ALL SHAPES DRAWED ON DRAW AREA.
    public void clear() {
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, (int) this.getWidth() + 55, (int) this.getHeight() + 55);
        super.repaint();
    }
    //FIRST DRAWING WHITE IMAGE TO ABLE SAVE DRAWED SHAPES ON DRAWING AREA.
    //AFTER THAT DRAWING WHEN FIRE BUTTONS ACTIONLISTENER (FROM CODER_PAINT CLASS) SELECTING SHAPES WITH IF &amp; ELSE.
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image == null) {
            image = createImage((int) this.getWidth(), (int) this.getHeight());
            g2 = (Graphics2D) image.getGraphics();
            g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            clear();
        }
        g.drawImage(image, 0, 0, this);
        g2.setColor(initialColor);

        if(shape == Shapers.PENCIL){
            g2.setColor(currentColor);
            g2.fillOval(draggedX, draggedY, thickness, thickness);
            repaint();
        }
        else if(shape == Shapers.OVAL){
            g2.setColor(currentColor);
            g2.drawOval(oldX, oldY, draggedX, draggedX);
            repaint();
        }
        else if(shape == Shapers.FILLEDOVAL){
            g2.setColor(currentColor);
            g2.fillOval(oldX, oldY, draggedX, draggedY);
            repaint();
        }
        else if(shape == Shapers.RECT){
            g2.setColor(currentColor);
            g2.drawRect(x, y, width, height);
            repaint();
        }
        else if(shape == Shapers.FILLEDRECT){
            g2.setColor(currentColor);
            g2.fillRect(x, y, width, height);
            repaint();
        }
        else if(shape == Shapers.LINE){
            g2.setColor(currentColor);
            g2.drawLine(oldX, oldY, lastX, lastY);
            oldX = lastX;//SETTING FIRST COORDINATE TO LAST COORDINATE BECAUSE ABLE TO CONTINUE DRAWING LINE.
            oldY = lastY;
            repaint();
        }
        else if(shape == Shapers.ERASER){
            g2.setColor(Color.WHITE);
            g2.fillRect(draggedX, draggedY, thickness, thickness);
            repaint();
        }
        else{

        }
    }
    //AFTER DRAWING IF THE USER WANTED SAVE THE DRAWED WE CAN USE THIS METHOD.
    public void SaveImage() {
        try {
            String fileName = JOptionPane.showInputDialog(null, "Please enter file name...");
            String fileType = JOptionPane.showInputDialog(null, "Please enter file type...");

            if (fileName != null &amp;&amp; fileType != null &amp;&amp; fileName.length() &gt; 0 &amp;&amp; fileType.length() &gt; 0) {

                ImageIO.write((RenderedImage) image, fileType.toUpperCase(),//WRITING NEW FILE DATAS GETTED FROM DRAW AREA IMAGE.
                        new File("/Users/MacbookPro/Desktop/" + fileName + "." + fileType.toUpperCase()));
                JOptionPane.showMessageDialog(null, "Your image saved.");
            } else {
                JOptionPane.showMessageDialog(null, "Please try re saving and dont't forget filling the blanks!");
                return;
            }
        } catch (IOException e2) {System.out.println("CanNot save the image!");}
    }
    //CHANGING CHOOSED COLOR PANEL TO USER CAN KNOW WHICH COLOR CHOOSED NOW
    public void changeColor(JPanel panel) {panel.setBackground(currentColor);}
    //THIS METHOD USING TO IMPORT IMAGE FROM COMPUTER.
    public void PrintImage(Image img) {
        g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
        super.paint(g2);
        repaint();
    }
    //CALLING UPDATE METHOD FOR WHAT I'M ALSO DON'T KNOW :)
    public void update(Graphics g) {super.repaint();}

}
</code></pre>