/ / Як змінити форми при натисканні пунктів меню в java - java, swing, shape, paintcomponent, menubar

як змінити форми при натисканні елементів меню в java - java, swing, shape, paintcomponent, menubar

У мене виникають проблеми при зміні форм, які відображаються, коли користувач натискає на пункт меню java за допомогою JFrame. Чи може хтось запропонувати, як я можу вирішити це? Нижче мій код:

public class PlayingWithShapes implements ActionListener
{
protected JMenuItem circle = new JMenuItem("Circle");
protected String identifier = "circle";
public PlayingWithShapes()
{
JMenuBar menuBar = new JMenuBar();
JMenu shapes = new JMenu("Shapes");
JMenu colors = new JMenu("Colors");

circle.addActionListener(this);
shapes.add(circle);
menuBar.add(shapes);
menuBar.add(colors);
JFrame frame = new JFrame("Playing With Shapes");
frame.setSize(600,400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.add(new Shapes());
frame.setJMenuBar(menuBar);
}

public static void main(String args[])
{
Runnable runnable = new Runnable() {
@Override
public void run() {
new PlayingWithShapes();
}
};
EventQueue.invokeLater(runnable);

}

Я хочу змінити форму у вигляді кола при натисканні на меню круглого елемента

@Override
public void actionPerformed(ActionEvent click) {

if(click.getSource() == circle){
Shapes shape = new Shapes();

}
}

public class Shapes extends JPanel
{

Як мені тоді називати прямокутник?

    @Override
public void paintComponent(Graphics shapes)
{
circle(shapes);
}

public void circle(Graphics shapes)
{
shapes.setColor(Color.yellow);
shapes.fillOval(200,100, 100, 100);
}
public void rectangle(Graphics shapes)
{
shapes.setColor(Color.MAGENTA);
shapes.fillRect(200,100,100,100);
}

}

}

Будь-яка допомога дуже цінується.

Відповіді:

1 для відповіді № 1

Пропозиції:

  • Не створюйте нові форми JPanel у вашій дії, оскільки це не дає жодного результату.
  • Замість цього в межах actionPerformed змінюється стан поля класу і базується малюнок у вашому методі paintComponent на стан, що знаходиться в цьому полі.
  • Наприклад, якщо у вас є тільки два різних типи фігур, вищевказане поле може бути просто булевим, можливо, називаним drawRectangle, а в actionPerformed ви "d" змінили це на true або false і зателефонуйте repaint();. А потім у вас "d" використовуйте блок if в межах paintComponent малювання прямокутника, якщо він є істинним або овальним, якщо ні.
  • Якщо ви хочете мати можливість малювати кількарізні форми, створюють перерахування і роблять поле обговорюваним вище полем цього переліку типу. Потім використовуйте оператор switch в paintComponent, щоб вирішити, яку форму малювати.
  • Якщо ви хочете показувати різні форми одночасно, тоді вам потрібно створити колекцію Shape, наприклад ArrayList<Shape> і додати до цієї колекції об'єкти, отримані у форміі потім перебирати його в цикл for в paintComponent, використовуючи об'єкт Graphics2D, щоб намалювати кожну форму. Я не думаю, що вам це потрібно прямо зараз.
  • Не забудьте зателефонувати super.paintComponent(g); в межах вашого методу.

тобто

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (drawRectangle) {
rectangle(g);
} else {
circle(g);
}
}