Программа, которая рисует фигуры по нажатию кнокпки

Я новичок, поэтому строго не судите. Нужна программа, которая по нажатию кнопки рисует на фрейме какую-либо фигуру. Например нажал на кнопку "Квадрат" нарисовался квадрат. Нажал на овал, квадрат удалился, а овал вылез. Вот в таком роде. Подскажите пожалуйста. Есть окно, рисует квадрат и овал. Только если первый нажал на квадрат, то потом овал не рисуется и наоборот. Может есть какой-нибудь метод, который очищает панель и можно снова на ней рисовать? Пробовал repaint, remove, removeAll. Программа все равно работает некорректно

package createdGUI;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SimpleComponentTest extends JFrame {

    public SimpleComponentTest() {
        super("SVG графика");
        JPanel cp = new JPanel(new BorderLayout());
        setContentPane(cp);

        JButton btn = new JButton("Квадрат");
        JButton btn1 = new JButton("Овал");
        JButton btn2 = new JButton("Треугольник");
        JButton btn3 = new JButton("Изображение");

        JPanel pb = new JPanel();
        pb.add(btn);
        pb.add(btn1);
        pb.add(btn2);
        pb.add(btn3);
        add(pb,BorderLayout.NORTH);

        btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {


                cp.add(new Rect());
                setContentPane(cp);
                repaint();

            }
        });

        btn1.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {

                cp.add(new Oval());
                setContentPane(cp);
                repaint();

            }
        });

        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new SimpleComponentTest().setVisible(true);
    }
}

Ответы (2 шт):

Автор решения: Mykola Kikets

Самым простым вариантом будет после очистки снова добавить кнопки:

btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                cp.removeAll();
                cp.revalidate();
                add(pb,BorderLayout.NORTH);
                cp.add(new Rect());
                setContentPane(cp);
                repaint();

            }
        });

В качестве примера...

Если посложнее, то это поиск елементов и их удаление:

btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                for(Component component : cp.getComponents()){
                  if(!component.equals(pb)){
                    cb.remove(component);
                  }
                }
                cp.revalidate();
                cp.add(new Rect());
                setContentPane(cp);
                repaint();

            }
        });

или

btn.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                for(Component component : cp.getComponents()){
                  if(!component instanceof JPanel){
                    cb.remove(component);
                  }
                }
                cp.revalidate();
                cp.add(new Rect());
                setContentPane(cp);
                repaint();

            }
        });
→ Ссылка
Автор решения: Дмитрий

Ваш код можно упростить. По сути все несложно:

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleComponentTest extends JFrame {

    private final JPanel cp;
    private final JPanel pb;

    public SimpleComponentTest() {
        super("SVG графика");
        this.cp = new JPanel(new BorderLayout());
        this.pb = new JPanel();
        init();
    }

    private void init() {
        add(cp);
        add(pb, BorderLayout.NORTH);
        setSize(500, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        addButton(new Rect(), new Oval());
        //addButton("Треугольник");
        //addButton("Изображение");
    }

    private void addButton(Figure... figures) {
        for (Figure figure : figures) {
            JButton button = new JButton(figure.getFigureName());
            pb.add(button);
            button.addActionListener(e -> paint(figure));
        }
    }

    private void paint(Figure figure) {
        cp.removeAll();
        cp.add(figure);
        cp.revalidate();
        cp.repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new SimpleComponentTest().setVisible(true));
    }

}

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

public abstract class Figure extends JComponent {

    protected static final int X = 20;
    protected static final int Y = X;
    protected static final int W = 100;
    protected static final int H = W;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(W + 2 * X, H + 2 * Y);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintFigure(g);
    }

    protected abstract void paintFigure(Graphics g);

    public abstract String getFigureName();

}

public class Oval extends Figure {

    @Override
    protected void paintFigure(java.awt.Graphics g) {
        g.drawOval(X, Y, W, H);
    }

    @Override
    public String getFigureName() {
        return "Овал";
    }

}

public class Rect extends Figure {

    @Override
    protected void paintFigure(java.awt.Graphics g) {
        g.drawRect(X, Y, W, H);
    }

    @Override
    public String getFigureName() {
        return "Квадрат";
    }

}
→ Ссылка