Вы должны начать с нескольких примеров для создания GUI.
static
для глобального, когда-то существовавшего экземпляра;один на класс.Попробуйте удалить все, только точку входа в программу:
public static void main(String args) {
JFrame appWindow = new MyFrame();
SwingUtilities.invokeLater(() -> appWindow->setVisible(true));
}
public class MyFrame extends JFrame {
private MyPanel panel;
public MyFrame() {
panel = new MyPanel();
add(panel);
panel.addClickListener(evt -> panel.repaint(50L));
}
}
public class MyPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.RED);
g2.drawRectangle(40, 40, getWidth() - 80, getHeight() - 80);
}
}
Механизм выглядит следующим образом:
- Клик обрабатывается в потоке диспетчеризации событий свинга.
- Здесь он говорит
repaint
о панели за 50 мс. - Чуть позже
repaintComponent
вызывается из свинг-фреймворка в связи со стиранием фона и рисованием дочерних компонентов.
В paintComponent
параметр Graphics
для всех более новых версий Java на самом деле является Graphics2D
, который имеет много хороших методов.