Программа, которая рисует фигуры по нажатию кнокпки
Я новичок, поэтому строго не судите. Нужна программа, которая по нажатию кнопки рисует на фрейме какую-либо фигуру. Например нажал на кнопку "Квадрат" нарисовался квадрат. Нажал на овал, квадрат удалился, а овал вылез. Вот в таком роде. Подскажите пожалуйста. Есть окно, рисует квадрат и овал. Только если первый нажал на квадрат, то потом овал не рисуется и наоборот. Может есть какой-нибудь метод, который очищает панель и можно снова на ней рисовать? Пробовал 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 шт):
Самым простым вариантом будет после очистки снова добавить кнопки:
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 "Квадрат";
}
}