2009-11-05 3 views
3

Я делаю JApplet и застреваю с проблемой анимации.Как сделать анимацию с Swing?

Вот мой код:

 this.sprite.setBounds(0,0,20,17); 
     this.sprite.setIcon(this.rangerDown); 
     for(int i = 0; i< 16;i++) 
     { 
      this.sprite.repaint(); 
      this.sprite.setLocation(this.sprite.getX(), this.sprite.getY()+10); 
      try{ 
       Thread.currentThread().sleep(100); 
      }catch(InterruptedException e){ 
      } 
     }  

С этим нет анимации: ничего не происходит во время цикла, метод перекрасить(), кажется, действуют только после того, как спрайт перестал двигаться.

Я хотел бы использовать только Swing для этого, любые идеи о том, как действовать?

Спасибо за чтение.

ответ

4

Вы должны использовать javax.swing.Timer для выполнения анимации, а не спина Thread. Вот вам хорошая ссылка для получения: http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html

Также я настоятельно рекомендую купить книгу Filthy Rich Clients - если вы заходите на сайт, вы также можете скачать весь код примера бесплатно. Например, Chapter 12: Animation Fundamentals имеет ряд замечательных примеров, таких как MovingButton, который демонстрирует использование таймера.

+0

Это вполне приемлемо для спящего режима() в нити изменения изображения, если этот поток не имеет ничего лучшего, и пока этот поток не является рабочим потоком Swing, который необходимо оставить без работы:) –

+0

@Carl - true :) Большинство документов и статей по Java-анимации предпочитают класс Timer. Вот хорошая статья Sun, в которой рассказывается об обоих подходах к анимации: http://java.sun.com/products/jfc/tsc/articles/timer/ (поиск «сна», чтобы увидеть некоторые из сравнений). –

+0

Это сработало, спасибо большое! –

1

Вы оставили код, окружающий ваш код, что делает его немного сложнее, чтобы помочь вам.

У вас, скорее всего, проблема с обработкой потоков. Есть рабочая ветка Swing, ответственная за отображение ваших вещей; если вы спите внутри этой нити, он не может выполнять свою работу. Если вы меняете изображение из-за пределов этого потока, он может не поднять это изменение, потому что вы не синхронизируете его с потоком Swing.

Чтобы выполнить это, вы должны использовать что-то вроде SwingUtilities.invokeLater (Runnable r), где ваш код смены изображения будет в методе run() r. Если вы Google для «invokeLater» и Swing, скорее всего, вы найдете примеры.

Смежные вопросы