2010-11-16 41 views
3

我有一個java程序的大問題。 我嘗試實現一個簡單的軟件。 有一個標籤,我想標籤在這個標籤中的文字,但這必須分開2秒。延遲setText標籤問題java

我看到了線程和Swing的問題,我實現了這段代碼,但結果沒有改變。 你能幫我請 感謝

public void stampChips1(int numberDecrement){ 

     ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       jLabel1.setText("L'avversario ha deciso di togliere : . "); 
      } 
     }; 
     new javax.swing.Timer(2000, taskPerformer).start(); 


     ActionListener taskPerformer2 = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       jLabel1.setText("L'avversario ha deciso di togliere : . . "); 
      } 
     }; 
     new javax.swing.Timer(2000, taskPerformer2).start(); 


     ActionListener taskPerformer3 = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       jLabel1.setText("L'avversario ha deciso di togliere : . . ."); 
      } 
     }; 
     new javax.swing.Timer(2000, taskPerformer3).start(); 



     jLabel1.setText("L'avversario ha deciso di togliere : " + numberDecrement); 
    } 
+0

凌亂的代碼,我的朋友 – 2010-11-16 17:29:27

回答

2

每次你在你的代碼中調用javax.swing.Timer.start()時,它都將繼續觸發事件,每2秒(在你的構造函數設置)。經過幾個時間間隔後,最終有三個不同的計時器嘗試(併成功)將文本設置在同一個標​​籤中。標籤的文本取決於哪個Timer的ActionListener最後執行完畢。如果你想有一個定時器火一旦停止,你應該設置它是這樣的:

javax.swing.Timer tmr = new javax.swing.Timer(2000, taskPerformer); 
tmr.setRepeats(false); 
tmr.start(); 

現在每個定時器只有一次火,消除了由於標籤上的任何覆蓋問題。

增加每個請求的評論:

當您設置每一個定時器,將它設置爲只火一次(和camickr說明),設置了不同的間隔每個定時器。

第一個定時器應當是:

javax.swing.Timer tmr1 = new javax.swing.Timer(2000, taskPerformer); 
tmr1.setRepeats(false); 
tmr1.start(); 

第二計時器應該是相似的:tmr2 = new ... (4000, taskPerformer2);
第三計時器應該是相似的:tmr3 = new ... (6000, taskPerformer3);

與您的初始代碼的問題是,當你的stampChips1(int)方法執行它首先設置三個定時器來觸發事件EVERY兩秒鐘,然後寫入標籤。

時間
0 - jLabel1的= 「L'avversario公頃deciso二togliere:」 + numberDecrement
〜2秒 - jLabel1的= 「L'avversario公頃deciso二togliere:」
〜2秒 - JLabel1所做=「L 'avversario ha deciso di togliere:。「
〜2s - jlabel1 =」L'avversario ha deciso di togliere:......「
〜4S - jLabel1的= 「L'avversario公頃deciso二togliere:」
〜4S - JLabel1所做= 「L'avversario公頃deciso二togliere:」
〜4S - JLabel1所做=「L'avversario公頃deciso di togliere:......「

所有的定時器都在同一時間觸發關閉,它們不會停止,直到調用Timer.stop()或通過Timer.setRepeats(false)指示它只觸發一次。

+0

你可以發佈一個簡單的例子,因爲我不明白你的解決方案。謝謝 – zp26 2010-11-16 20:06:41

+0

增加了一點,希望這可以幫助你瞭解問題所在。 – 2010-11-16 20:51:30

0

也使用你的基本代碼,你需要有不同的時間間隔(2000,4000,6000),否則所有的定時器會同時觸發。

0
void uiFunction(JLabel label) { 
new Thread() { 
    public void run() { 

      final jLabel1=label; 
      SwingUtilities.invokeLater(new Runnable() { 
       jLabel1.setText("L'avversario ha deciso di togliere : . "); 
       jLabel1.repaint(); 
      } 
      Thread.sleep(2000); 
      SwingUtilities.invokeLater(new Runnable() { 
       jLabel1.setText("L'avversario ha deciso di togliere : .. "); 
       jLabel1.repaint(); 
      } 
      Thread.sleep(2000); 

      SwingUtilities.invokeLater(new Runnable() { 
       jLabel1.setText("L'avversario ha deciso di togliere : ... "); 
       jLabel1.repaint(); 
      } 

    } 
}.run(); 

}

我面臨着類似的那種problem。你可以在無限循環中調用這個函數,如果你希望這種情況永遠發生...