У мене виникають проблеми при зміні форм, які відображаються, коли користувач натискає на пункт меню 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);
}
}