Быстрое исправление:
Изменить ImageAnimator () следующим образом:
lblDisplay.setIcon(images);
lblDisplay.paintImmediately(getBounds());
th.sleep(25);
Проблема, с которой вы столкнулись, заключается в том, что установка значка не приводит к автоматической перерисовке Swing компонента на экране. Вызов paintImmediate сделает это.
Общие рекомендации:
Анимация в разгаре обычно выполняется с помощью Swing Timer . В этот момент вы заметите, что ваш пользовательский интерфейс не отвечает - запустив анимацию, вы не сможете остановить ее, пока она не закончится. Это связано с тем, что все события Swing происходят в одном потоке - нити диспетчеризации событий. Выполнение цикла с Thread.sleep (...) в середине связывает этот поток, оставляя его недоступным для обработки другого ввода (например, нажатия кнопки остановки)
Эта статья неизмеримо помогла мне, когда я пытался понять, как Swing обрабатывает параллелизм, и Swing Trail дает множество советов по эффективному использованию Swing, рисованию пользовательских компонентов и т. Д.
Я бы также включил демонстрационный код в Filthy Rich Clients , я сейчас работаю над книгой, и это стоит посмотреть.