2013-05-19 41 views
1

我有一個代碼,當用戶按下一個按鈕時,一條消息應該顯示在文本區域,並且在2〜3秒之後,它應該消失。 Thread.sleep(毫秒)應該做到這一點,但它似乎並沒有工作(是的,我已經在try/catch和一切)。 這裏是我的聽衆:在程序中暫停(睡眠) - 似乎沒有正常工作?

private class moveListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     CardLayout cl = (CardLayout)(cards.getLayout()); 

     for(int i = 0; i < 4; i++) 
     { 
      for(int j = 0; j < 3; j++) 
      { 
       if(e.getSource() == move[i][j]) 
       { 
        turn++; 
        if(turn == 4) 
         turn = 0; 


        text.setText(""+SPRITES[i]+" has used " + move[i][j].getText()); 

        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException ex) { } 
        text.setText(""); 


        cl.show(cards, MAIN); 

       } 
      } 
     }   
} 

當我跑這我能感覺到整個程序凍結(可能是由於sleep()方法),但它跳過text.setText(theMessage),並徑直到文本。的setText( 「」); 換句話說,它應該去哪裏點擊> Display> rest> erase;它確實點擊>休息>擦除。我已經嘗試了其他方法:這是做經典的(int i = 0;我< 9999999; i ++)的東西像20個小時,但是做了與Thread.sleep()方法相同的事情。

有什麼辦法解決這個問題?我已經讀了一些關於它與線程使用UI不好,但不知道這意味着什麼....任何幫助表示讚賞。

+7

請不要在睡眠事件調度線程中睡眠 – Doorknob

+0

「*當我運行這個時,我可以感覺到整個程序凍結(可能是由於sleep()方法)*」 -​​ 不大可能。這是肯定的**。不要使用睡眠,它會阻止EDT。改爲使用'javax.swing.Timer'。 – Maroun

+0

嘗試將'text.setText(「」);'移動到try塊中。 – christopher

回答

0
  text.setText(""+SPRITES[i]+" has used " + move[i][j].getText()); 

      Thread t = new Thread(){ 
       public void run() { 
        try { 
         Thread.sleep(3000); 
        } catch (InterruptedException ex) { } 
        SwingUtilities.invokeLater(new Runnable() { 
         text.setText(""); 
         cl.show(cards, MAIN);        
        }); 
       } 
      }; 
      t.start(); 

通常的模式是:

有 「GUI線程」 或EDT,或者無論你想調用它。

GUI線程在GUI中執行某些操作。

然後啓動一個等待一段時間的新線程。

在GUI線程之間可以渲染GUI的其他部分,對鼠標作出反應等等。

然後新線程喚醒並通過將一個Runnable對象傳遞給GUI線程告訴GUI線程要做什麼(有幾種方法可以這樣做,我在這裏使用一種常用的方法)。

+0

這還不是睡在美國東部時間嗎? – arcy