Это довольно распространенный элемент программирования GUI. У вас есть один поток, который обрабатывает отрисовку графического интерфейса, получение ввода и выполнение обратных вызовов. Если другой поток попытается изменить объекты, связанные с графическим интерфейсом, он будет конфликтовать с потоком графического интерфейса. Скажем, например, это было что-то наполовину через рисование чего-то, и вы меняете цвет из другого потока.
Все, что делает invokeLater, это ставит в очередь что-то для запуска потока GUI. К «позже» он действительно запускается практически мгновенно, но текущему потоку не нужно его ждать. Возможно, поток графического интерфейса выполняет отрисовку или ожидает возврата функции обратного вызова, что задержит выполнение кода, который вы ему дали.