2014-11-17 82 views
0

我需要製作一個圖形用戶界面,工人進入一個工作站(面板上的一個點),並在那裏停留一段時間,顯示在關於工人頭部的倒計時中(所以,一旦工人移動到了現場,該臺的標籤顯示3s - > 2s - > 1s,然後工人離開,標籤恢復爲「OPEN」)。我在做這件事情時遇到了麻煩,因爲我對Java所使用的Timer(s?)不太熟悉。我試着像這樣的東西:Java gui倒計時

Timer timer = new Timer(1000, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      //change label text/color, decrement countdown 
      panel.repaint(); 
      Thread.sleep(1000); 
     } 
    }); 

但我不能達到的秒數計算從定時器內部下來,我不知道如何在價值傳遞給計時器。如果有人能幫助我,我會很感激。

回答

3

擺脫Thread.sleep()。這就是Timer(1000, new ActionListener()中的1000。它爲每個計時器事件設置一個間隔。每次發生定時器事件時,都會調用actionPerformed。因此,您需要確定每個「打勾」需要發生什麼,並將該代碼放入actionPerformed。也許像

Timer timer = new Timer(1000, new ActionListener() { 
    private int count = 5; 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if (count <= 0) { 
      label.setText("OPEN"); 
      ((Timer)e.getSource()).stop(); 
      count = 5; 
     } else { 
      label.setText(Integer.toString(count); 
      count--; 
     } 
    } 
}); 

你需要決定何時調用timer.start()

+0

我這樣做倒計時GUI部分工作,但是當我試圖讓工人停止,而倒計時發生(通過調用sleep(1000)爲第二計數),直到我的工人離開纔會發生倒計時。所以工人去車站,停了3秒,當他離開時,車站頂部倒計時。任何想法如何我可以解決這個問題? – user3622688

+0

對不起,不知道你在說什麼。爲了獲得更好的幫助,請發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) –

1

問題1:你是從Swing GUI線程中調用Thread.sleep()方法。這會導致線程停止輸入並凍結。刪除該行。你不好!在您處於此狀態時,還要刪除重繪呼叫。

既然這麼說了,而不是創建一個ActionListener的匿名實例,您可以創建一個實現ActionListener並提供構造函數的實際類。該構造函數可以將您想要開始倒計數的秒數作爲參數。您可以在您正在使用的方法內聲明該類,也可以在類中聲明它。

這裏有一個骨骼例如:

public class OuterClass { 
    JLabel secondsLabel = ...; 
    Timer myTimer; 

    private void setupTimer(int numSecondsToCountDown) { 
     secondsLabel.setText(Integer.toString(numSecondsToCountDown)); 
     myTimer = new Timer(1000, new CountdownListener(numSecondsToCountDown)); 
     myTimer.start(); 
    } 

    // ... 
    class CountdownListener implements ActionListener { 
     private int secondsCount; 

     public CountdownListener(int startingSeconds) { secondsCount = startingSeconds; } 

     public void actionPerformed(ActionEvent evt) { 
     secondsLabel.setText(Integer.toString(secondsCount); 
     secondsCount--; 

     if (secondsCount <= 0) { // stop the countdown 
      myTimer.stop(); 
     } 
     } 
    } 
}