2016-05-16 59 views
0

我試圖每200毫秒更改JLabel上的圖標以模擬滾動骰子,我一直在線上搜索,而且我無法弄清楚如何設置一個定時器,以便我可以運行方法。 這是方法每200毫秒更換圖標

public void dice(){ 
    int whichOne=(int)(Math.random()*6+1); 
    if(whichOne==1){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice1.png")));} 
    else if(whichOne==2){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice2.png")));} 
    else if(whichOne==3){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice3.png")));} 
    else if(whichOne==4){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice4.png")));} 
    else if(whichOne==5){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice5.png")));} 
    else if(whichOne==6){jLabel12.setIcon(new ImageIcon(getClass().getResource("/spanish/dice6.png")));} 
} 

這是I'm目前如何調用該方法

for(int i=0;i<9;i++){ 
    dice(); 
} 

感謝您的幫助。

+1

https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html – pvg

+0

儘管如此,每30毫秒調用一次這種方法對於模擬骰子並不是一個好主意。這種方法在性能上不必要地沉重,你可以連續兩次得到相同的數字,這實際上並不是你想要的。圖形部分的第二種方法可能會更好。 – Gendarme

+0

我同意30毫秒可能不需要,並且將與Swing有性能問題。 Swing不是OpenGL,它不能做快速的實時動畫。看看讓你的代碼工作在100或200毫秒,然後看看它是否需要改進。 – markspace

回答

0

下面是有關如何使用TimerTimerTask調用dice一個解決辦法:

import java.util.*; 

... 

private void dieCaller() { 
    TimerTask task = new TimerTask() { 
     int numRolls = 0; 

     @Override 
     public void run() { 
      if (numRolls < 9) { 
       dice(); 
       numRolls++; 
      } 
      else { 
       cancel(); 
      } 
     } 
    }; 

    Timer timer = new Timer("Die Roller"); 
    timer.scheduleAtFixedRate(task, 0, 200); 
} 

... 

另外一個問題,我有:不加載這些ImageIcon小號每次。加載它們一次,並保存爲一個數組或其他東西,以便以後引用它們。