Я понимаю вашу проблему, так как я боролся с ней некоторое время, когда изучал графику Java.Это не просто Java 2D-графика - это часть AWT.
Когда вы создаете JFrame или какой-либо другой объект верхнего уровня, он выполняет большую работу "за кулисами" - частью которой является созданиеГрафический объект.(Нет явного уведомления об этом, хотя если вы пошагово прошли через код с помощью отладчика, вы можете увидеть классы, которые создают Graphics).
Затем вы создаете компоненты, которые добавляете или регистрируете в верхнемУровень объекта.Все они должны реализовывать метод обратного вызова, включая
paint(Graphics g);
. Затем вы переопределяете эти методы @Override, чтобы при визуализации компонента использовать ВАШ метод рисования.
Не пытайтесь сохранить рисунок или создать новый.Думайте об этом как о структуре, которая снимает с вас ответственность.
Размер компонентов часто берется из ваших рук.Если вы используете менеджер макетов, то он может решить изменить размер вашего компонента.
Если вы исходите из процедурного императивного фона, у вас вполне могут быть проблемы (я из FORTRAN).Я бы посоветовал попробовать несколько учебных пособий, и на каком-то этапе просветление начнет наступать.
Общая документация по Java-графике плохая.Существует множество непрозрачных концепций (см. Как работает Java Graphics.drawImage () и какова роль ImageObserver ).Ранняя реализация была поспешной и имела много ошибок.Даже сейчас часто неясно, следует ли и в каком порядке вызывать такие методы, как setPack()
и setVisible()
.
Это не означает, что вы не должны его использовать!Просто кривая обучения немного длиннее, чем у IMO.
БОЛЬШЕ: Кроме того, ВЫ не решаете, когда что-то нарисовано, делает каркас.paint(g)
действительно означает «framweork перерисовывает свои компоненты. Что вы хотите, чтобы этот компонент предоставил на данном этапе».
Возможно, providePaintingInstructionsWhenRequiredForComponentGraphics(Graphics g)
будет полезным именем.
Аналогично repaint()
не перекрашивает по вашим заказам, но когда система считает, что это необходимо.Я не нашел это полезным.
Если вы, скажем, изменяете размер компонента в интерактивном режиме, каждое небольшое изменение обычно вызывает paint(g)
.попробуйте поместить LOG.debug () в код рисования и посмотреть, когда он вызывается.