как использовать таймер поворота для запуска / остановки анимации

Может ли кто-нибудь научить меня использовать swing timer с целью:

Мне нужно иметь многоугольник, который начинает анимироваться (простая анимация, такая как rotation), когда я нажимаю на мышь; и останавливает анимацию, когда я нажимаю снова.

У меня нет проблем с пониманием того, как работает MouseListener , но с фактической анимацией. Я попытался имитировать анимацию с помощью блока while в методе paint() где я бы рисовал, стирал и перерисовывал многоугольник (например, для имитации вращения), но в то время апплет не слушал клики. Он слушал только после этого. Мне понадобится таймер поворота, чтобы сломать время, когда я нажимаю на мышь.

 import javax.swing.Timer; 

Добавить атрибут;

 Timer timer; boolean b; // for starting and stoping animation 

Добавьте следующий код в конструктор фрейма.

 timer = new Timer(100, new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { // change polygon data // ... repaint(); } }); 

Переверните paint(Graphics g) и нарисуйте многоугольник из данных, которые были изменены actionPerformed(e) .

Наконец, кнопка, которая запускает / останавливает анимацию, имеет следующий код в обработчике событий.

 if (b) { timer.start(); } else { timer.stop(); } b = !b; 

Этот пример управляет javax.swing.Timer с помощью кнопки, в то время как этот связанный пример реагирует на щелчок мышью. Последний пример меняет направление на каждый клик, но start / stop – это простое изменение.

Апплет не будет прослушивать клики, потому что основной stream (Thread Dispatch Thread, EDT) находится внутри цикла while и не прослушивает ваши клики.

Вам нужен другой stream. (попробуйте использовать SwingWorker http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html )

Таким образом, SwingWorker будет выполнять цикл while в фоновом режиме, публикуя результаты, чтобы заставить ваш полигон двигаться.

Затем EDT может сосредоточиться на любых событиях (например, кликах). Затем вы можете просто использовать событие click, чтобы убить SwingWorker, если вы хотите его остановить.

Удачи

  • Создайте простой обратный отсчет при обработке
  • Давайте будем гением компьютера.