2009-11-05 57 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執行動畫而不是線程睡眠。這裏是一個很好的鏈接讓你走:http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html

另外,我強烈推薦購買書Filthy Rich Clients - 如果你去到網站,你也可以免費下載所有的示例代碼。例如,Chapter 12: Animation Fundamentals有一些很棒的例子,例如演示Timer使用情況的MovingButton。

+0

在圖像更改線程中sleep()是完全可以接受的,只要該線程沒有更好的操作,只要該線程不是Swing工作線程,它必須保持不受干擾地工作: ) – 2009-11-05 19:37:14

+0

@Carl - true :)大多數關於Java動畫的文檔和文章都喜歡Timer類。以下是一篇很好的Sun文章,講述了動畫的兩種方法:http://java.sun.com/products/jfc/tsc/articles/timer/(搜索「睡眠」以查看一些比較結果)。 – 2009-11-05 19:44:41

+0

它的工作,非常感謝! – 2009-11-05 20:46:15

1

您遺漏了代碼周圍的代碼,這使得它有點難以幫助您。

您可能遇到線程處理問題。有一個Swing工作線程負責顯示你的東西;如果你睡在那個線程裏面,它就無法完成它的工作。如果你從這個線程之外改變圖像,那麼它可能沒有選擇這個改變,因爲你沒有正確地與Swing線程同步。

您需要使用像SwingUtilities.invokeLater(Runnable r)來完成此操作,其中您的圖像更改代碼將位於r的run()方法中。如果你是Google的「invokeLater」和Swing,你可能會找到例子。