Как добавить больше одного элемента в JFrame? Как добавить элемент графики по нажатию кнопки?
Нужно, чтобы по нажатию кнопки (but) поверх прямоугольника рисовались точка и линия. Весь день ломаю голову. Отрисовывается только прямоугольник. При нажатии кнопки в консоль выводится сообщение "Нажатие совершено", однако действие внутри кнопки не выполняется
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(new Dimension(600, 500));
JButton but = new JButton("Demo");
but.setSize(80, 35);
frame.add(but);
frame.setLocationRelativeTo(null);
JPanel c = new JPanel() {
@Override
public void paintComponent(Graphics g) {
Polygon p = new Polygon();
p.addPoint(200, 200);
p.addPoint(400, 200);
p.addPoint(400, 300);
p.addPoint(200, 300);
g.drawPolygon(p);
}
};
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPanel panel = null;
panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawOval(100, 100, 3, 3);
g2d.drawLine(100, 100, 500, 600);
}
};frame.add(panel);
System.out.println("Нажатие совершено...");
}
});
frame.add(c);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
Ответы (1 шт):
Вам нужно было просто обновить фрейм, и указать ему setVisible(true) для отрисовки. Так же, я рекомендую вам разделять задачи на более мелкие, используйте классы и методы, чтобы это читалось легче.
И немного документации с оракла по поводу обновления фрейма, если кратко то существует несколько тригеров для его "отрисовки с нуля / обновления проще говоря":
System-triggered Painting In a system-triggered painting operation, the system requests a component to render its contents, usually for one of the following reasons:
The component is first made visible on the screen. The component is resized. The component has damage that needs to be repaired. (For example, something that previously obscured the component has moved, and a previously obscured portion of the component has become exposed).
https://www.oracle.com/java/technologies/painting.html
Ваш код :
public class Main {
public static void main(String[] args) {
final JFrame frame = new JFrame();
frame.setSize(new Dimension(600, 500));
frame.add(createButton(frame));
frame.setLocationRelativeTo(null);
frame.add(new Panel1());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private static JButton createButton(JFrame frame){
JButton but = new JButton("Demo");
but.setSize(80, 35);
but.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
repaintMethod(frame);
}
});
return but;
}
private static void repaintMethod(JFrame frame){
frame.add(new Panel2()); // Непонятно почему добавляем новую по клику
frame.repaint();
frame.setVisible(true);
System.out.println("Нажатие совершено...");
}
}
class Panel1 extends JPanel{
@Override
public void paintComponent(Graphics g) {
Polygon p = new Polygon();
p.addPoint(200, 200);
p.addPoint(400, 200);
p.addPoint(400, 300);
p.addPoint(200, 300);
g.drawPolygon(p);
}
}
class Panel2 extends JPanel{
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawOval(100, 100, 3, 3);
g2d.drawLine(100, 100, 500, 600);
}
}