Когда вы используете repaint
, система AWT вызовет метод canvas * update()
, который очистит графику (нарисовав прямоугольник в цвете фона) и затем вызовет paint()
. (Это для тяжелых компонентов AWT, таких как Canvas
- для Swing это немного отличается.)
Итак, простой обходной путь будет дан путем переопределения update
, чтобы не очистить компонент:
public void update(Graphics g) {
this.paint(g);
}
Обратите внимание, что старые нарисованные строки все еще могут исчезнуть, когда система решит, что ваш компонент должен быть признан недействительным, например, после того, как другое окно покрыло это.
Не имеет отношения к этому:
Вы никогда не должны спать методом рисования (возможно, другим для отладки). Рисование будет выполнено в потоке отправки событий, и пока метод paint
не завершен, никакие события не будут отправлены. Не делай этого.
Вместо этого, отдельный поток (или даже основной поток) выполняет цикл, который спит и вызывает repaint
.
Также, как говорит Hovercraft, не смешивайте AWT с Swing. Используйте AWT Frame
вместо JFrame Swing, если вы хотите использовать Canvas
.