2016-11-22 30 views
1

我最近做了一個小型益智遊戲,處理點擊某些領域。我也做了一個求解器來激活必要的領域來贏得勝利。我面臨的問題是,我想暫停每次激活某個區域以創建一種「解決動畫」的問題。我的問題是在這裏代表如何使一個方法使用擺動,睡眠使用定時器

package experiment; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class ExperimentHere extends JFrame implements ActionListener 
{ 

private static final long serialVersionUID = 1L; 
private JButton changeLabelButton; 
private JPanel mainPanel; 
private JLabel labelToChange; 

public ExperimentHere() { 
    changeLabelButton = new JButton("Set the label"); 
    changeLabelButton.addActionListener(this); 

    mainPanel = new JPanel(); 

    labelToChange = new JLabel(); 
    labelToChange.setText("This needs to be changed"); 


    mainPanel.add(labelToChange); 
    mainPanel.add(changeLabelButton); 
    this.add(mainPanel); 

    setTitle("Timer Program"); 
    setContentPane(mainPanel); 

    setPreferredSize(new Dimension(1000, 1000)); 
    pack(); 

} 

public void actionPerformed(ActionEvent e) { 
    if (e.getSource().equals(changeLabelButton)){ 
     changeLabel(); 
    } 
} 

public void changeLabel(){ 
    for (int i = 0; i<5; i++){ 
     labelToChange.setText(""+i); 
     // Pause for 200ms here 

    } 
} 

public static void main(String[] args){ 
    ExperimentHere test = new ExperimentHere(); 
    test.setVisible(true); 
    } 
} 

我一直在使用定時器試過,但我不知道如何將它正確地格式化,以便它每次只暫停changeLabel()遞增內部的循環,因爲第二放慢參數在Timer()中請求一個ActionListener。 我也試過使用Thread.sleep(),但它只是凍結我的程序,然後立即解決它。

理想情況下,changeLabel方法將增加1,將標籤設置爲新的String,等待200ms,然後再次遞增。

回答

2

我一直在使用定時器試過,但我不知道如何當你使用一個Timer它正確格式,以便每次只暫停裏面changeLabel的循環()遞增

你不使用循環。 Timer的要點在於您啓動計時器並繼續執行,直到您停止Timer

您也不會製作方法,只要Timer激發,您就調用Action

因此,您需要在您的類中記錄Timer已觸發次數的實例變量(讓它稱爲「timerCounter」)。然後,您需要創建一個Action以在每次啓動Timer時調用。在類的構造函數

int timerCounter = 0; 
Action action; 

然後創建一個動作是這樣的::

因此,您創建了幾個實例變量所以現在你的按鈕的ActionListener

action = new AbstractAction() 
{ 
    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     labelToChange.setText("" + timerCounter); 
     timerCounter++; 

     if (timerCounter > 5) 
     { 
      Timer timer = (Timer)e.getSource(); 
      timer.stop(); 
     } 
    } 
} 

你可以這樣做:

timerCounter = 0; 
Timer timer = new Timer(200, action); 
timer.start(); 
+0

哦,我明白了,我誤解了定時器的使用。如果使用那樣的話,會更有意義。謝謝! – Kazutadashi

+0

@Kazutadashi,很高興它有幫助。不要忘了點擊勾號「接受」答案,以便人們知道問題已經解決。 – camickr