Вся окраска компонентов должна выполняться в один поток, поэтому они отображаются правильно. Таким образом, компонент будет знать, какая часть уже нарисована, а какая нет.
Если вы вызываете связанный с «рисованием» метод (paint, update, paintComponent, show, setVisible, pack и т. Д.) Вне EDT, вы будете пытаться рисовать в двух разных потоках, и это может вызвать проблемы.
Когда вам нужно использовать другой поток для обновления пользовательского интерфейса, вы должны вызвать его с помощью средства invokeLater, которое, в свою очередь, поместит его в EDT для вас, так что вы все равно будете рисовать в том же потоке.
Вам не нужно его использовать, если вы кодируете в методе, который уже выполняется в EDT (например, actionPerformed
или paint
или в одном из них), или если вы выполняете код, а не пользовательский интерфейс связанные (например, обработка файлов в фоновом режиме и т. д.)
Чтобы лучше понять все эти понятия, прочитайте: Правило одного потока