Отображать объекты в JFrame по одному или покадрово - PullRequest
0 голосов
/ 23 марта 2011

Я создал программу на Java (eclipse), которая отображает квадраты и треугольники на сетке, используя JFrame. Программа определяет, куда объекты попадают в цикл «for». Я хотел бы, чтобы объекты появлялись по одному (в покадровом подходе). Похоже, что для решения этой проблемы следует использовать «цикл сна». Однако я чувствую, что отсутствие понимания java.awt *; вызывает у меня проблемы. Я добавил следующее в мой цикл for

try<br> {<br> Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)<br> }<br> catch(InterruptedException e)<br> {<br> e.printStackTrace();<br> }

Программа ожидает, но рисует объекты сразу после того, как она закончила спать. Я просмотрел свою программу и обнаружил, что эта команда «сна» работает в некоторой степени (ожидание перед обработкой следующей команды). Я поместил оператор println в указанный «цикл for», чтобы проверить его, и программа ждет одну секунду, прежде чем печатать каждую из них. Println. Но я не знаю, почему JFrame рисует все только один раз в конце. Должен ли я использовать что-то вроде repaint () каждый раз, когда я хочу отобразить новый кадр?

МОЯ структура проекта - 3 класса. Главный, который просто вызывает DisplayFrame. DisplayFrame, который устанавливает фрейм. И MyComponent, который содержит мой цикл for и команду sleep.

Любая помощь будет оценена.

Ответы [ 3 ]

1 голос
/ 23 марта 2011

сон, вероятно, плохая идея. Вместо этого используйте таймер:

http://download.oracle.com/javase/6/docs/api/javax/swing/Timer.html

Из вашего описания немного сложно догадаться, что происходит, но я почти уверен, что происходит по крайней мере одна из двух плохих вещей:

  • вы спите в EDT (Thread Dispatch Thread), это блокирует весь графический интерфейс и может быть причиной того, что вы не видите никаких обновлений во время сна.

  • вы меняете компоненты свинга извне EDT, что является верным путем в ад параллелизма.

Убедитесь, что вы придерживаетесь этого подхода:

Установите время для звонка вам в желаемое время (скажем, каждые 0,1 секунды). В вызываемом методе манипулируйте вашим компонентом / объектом, чтобы отразить новое состояние, и вызовите repaint.

дайте нам знать, если это работает. Я не совсем уверен насчет повторного вызова ... может быть неправильно ..

1 голос
/ 23 марта 2011

Здесь есть учебник , в котором Timer используется для регулярного обновления изображения.Пример программы - это апплет, но принцип тот же.

0 голосов
/ 23 марта 2011

Интересно, что в учебнике по апплетам на сайте Oracle есть пример апплета, который выполняет анимацию с использованием SwingWorkers и Timers.Возможно, это может быть полезно для вас.

Или вы можете взять под контроль рендеринг JFrame, используя концепции из игрового мира, как объяснено здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...