2011-04-01 72 views
3

每次我的計數器達到4我希望它發出嗶聲並返回到'1',並再次計數到4播放嗶聲等。Java Swing我如何使這個計數器工作?

我可能不應該把它放在一個標籤中,因爲計數器根本不能運行! 我沒有得到任何錯誤,但標籤說:計數器是4,並不算數或任何東西。

你能幫我讓這個計數器正常工作嗎?我也使用了printline,但是 也給出了一些錯誤。

我的計數器代碼是這樣的:前4後

button1.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent arg0) { 

    label1.setVisible(true); 
    int counter = 1; 

    while(counter < 5) 
    { 
     label1.setText("counter is " + counter); 
     counter = counter + 1 ; 
    } 

    counter = 1; 
    tk.beep(); 
    } 
}); 
+1

什麼是你得到的錯誤? – 2011-04-01 11:54:41

+1

我沒有得到任何錯誤標籤說計數器是4並且在那裏沒有計數器 – Opoe 2011-04-01 11:57:07

+0

嘗試在更改標籤值後調用'validate()'和'repaint()'。 – 2011-04-01 12:00:06

回答

5

產生一個新線程來計數,等待和更新GUI。

你正在做事件調度線程中的所有這些工作,這是更新GUI的唯一線程。因此,當您設置標籤的文本時,它不會在屏幕上更新,直到方法返回並且「事件調度線程」處理重繪操作。

你需要產生一個新的線程來做到這一點,而不是在一個立即執行的循環中運行它。只需要actionPerformed方法產生一個新的Thread來代替它。在此線程中循環,計數和更新,並在更新之間等待Thread.sleep。要更新標籤文本,請創建一個新的Runnable,該標籤將標籤更新爲下一個值,並將其放置在SwingUtilities.invokeLater的事件派發線程上。保持這個線程在後臺運行,直到你需要它。我會建議檢查關閉狀態布爾每循環通過,並退出時,它被設置爲false。這樣,您可以在任何時候乾淨地關閉線程。或者,如果您想讓它倒計時並只發出一次蜂鳴聲,您可以在一次迭代計數後結束線程。

Stack Overflow上有很多關於這些步驟的詳細問題,所以我不會在這裏重複這些信息。

+0

感謝您對此有幫助的答案感謝! – Opoe 2011-04-01 12:23:36

+1

提及'shutdown'的+1。 – Max 2013-04-22 17:25:43

0

你的循環停止,不會再調用。由於文本正在變爲快速,所以只能看到最後的結果

int counter = 0; 
while (//when do you want it to stop?) 
{ 
    // print what you want (using (counter % 4) + 1) 
    if ((counter % 4) == 0) 
    { 
     tk.beep(); 
    } 
} 
1

更改值後需要重新繪製。另外,我假設你實際上想要計算秒數,在這種情況下,你需要使用計時器來啓動更改標籤和播放聲音的操作。

1

也許這就是做你intened什麼,每4個按鈕,按下它復位,蜂鳴

loginButton.addActionListener(new java.awt.event.ActionListener() { 

    int counter = 1; 

    public void actionPerformed(ActionEvent arg0) { 

     label1.setVisible(true); 

     if (counter < 5) { 
      label1.setText("counter is " + counter); 
      label1.repaint(); 
      ++counter; 
     } else { 
      counter = 1; 
      tk.beep(); 
     } 
    } 
}); 
+0

我得到一個錯誤重繪()我應該把什麼擺在這個? – Opoe 2011-04-01 12:23:06

+1

@Oppe,對不起,我更新了它,它當然應該在你的標籤上 – vickirk 2011-04-01 12:33:42

+0

謝謝你的幫助 – Opoe 2011-04-01 13:00:05

1

如果我理解正確的話,你想,下面的是什麼代碼應該完成你的目標。

button1.addActionListener(new ActionListener() { 

    public void actionPerformed(ActionEvent arg0) { 

    label1.setVisible(true); 

    Runnable runnable = new Runnable() { 
      int counter =1 ; 

      public void run() { 
       while(true) { 

        while (counter<5) { 
         SwingUtilties.invokeLater(new Runnable() { 
           public void run() { 
            label1.setText("counter is " + counter); 
           } 
         }); 

         counter = counter + 1 ; 
         try { 
          Thread.sleep(1000); 
         }catch(InterruptedException ex) { 
          System.err.println(ex.toString()); 

         }  
        } 
       counter = 1; 
       tk.beep(); 

       } 

      } 
    }; 

    new Thread(runnable).start(); 

});