0

Hi there,

I want to implement undo logic which deletes the last drawn shape. To test this logic i had cleared shapes list and redrawn all shapes but still last shape does not delete.

    public void drawAllShapes(Graphics2D g)
    {

        //draw all triangles
        for (DrawTriangle t : newTriangles)
        {
            t.drawTriangle(g);
        }

        for(DrawRect r: rectangles)
        {
            r.drawRectangle(g);
        }

        //draw all circles
        for (DrawCircle c : circles)
        {
            c.drawEllipse(g);
        }

        System.out.println("Rect size: " +rectangles.size());
        System.out.println("Circle size: " +circles.size());

    }//end drawAllShpapes

//undo logic
@Override
public void paintComponent(Graphics graphics){

 Graphics2D graphics2d = (Graphics2D)graphics;

if(UndoCommand.undoPressed) {
    rectangles.clear();

    drawAllShapes(g);
    UndoCommand.undoPressed = false;    
}
}

Please tell me what I am doing wrong here. Thanks !

2
Contributors
5
Replies
23
Views
3 Months
Discussion Span
Last Post by JamesCherrill
1

Normally for an undo you would get rid of the last thing you added - ie remove the last Triangle, Rectangle, or Circle from its corresponding list, then redraw.
Your code deletes all the Rectangles in the list - regardless of how many there are, and regardless of whether the last thing you added was a Triangle, Rectangle, or Circle.

Hint:
You can make this a whole lot simpler by recognising that triangle, rectangle, and circle are all kinds of shapes. You could create a DrawShape class, with an abstract draw(Graphics2D g) method. Let your three Draw... classes extend it, and each implement its own version of draw(Graphics2D g).
Now you only need one List<DrawShape> that you can add all three shapes to. You can draw them all with a single loop - Java will call the correct draw method for each type of shape.
And (here's the punch line) the last thing you created will always be the last DrawShape in the list, so to undo you just delete that one.

Edited by JamesCherrill

0

I really liked the idea of using polymorphism. But please can you tell me why drawAllShapes() function is not working in if condition.

@Override
public void paintComponent(Graphics graphics){
 Graphics2D graphics2d = (Graphics2D)graphics;
if(UndoCommand.undoPressed) {
    rectangles.clear();
    drawAllShapes(g);
    UndoCommand.undoPressed = false;    
}
}

Edited by RAHEEL_3

0

sorry its my mistake, please consider it graphics2d. but still having problem while calling drawAllShapes().

It delete shape when draw new shape on canvas. I want it delete shape on pressing undo button.

Any solution ?

1

I would not put the code lines 4-8 in paintComponent. They don't belong there, and don't forget that paintComponent may be called by Swing at any time.
I would just have paintComponent do the painting, nothing else.

In the listener for the undo button I would simply delete the latest entry from the shapes list and call repaint()

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.