2012-02-08 39 views
0

我寫了一個使用CardLayout的程序。我希望它顯示一個JPanel,然後根據用戶的輸入顯示一個新的JPanel,暫停3秒,然後顯示另一個需要用戶輸入的JPanel。當我使用睡眠時,JPanel沒有正確更新CardLayout

我的JPanel需要用戶輸入工作正常,而且我所做的調試告訴我,當程序暫停3秒鐘時,「填充」面板(見下文)正在生成,但只是沒有正確渲染。

class sylBetween extends JPanel{ 

    sylBetween(boolean response, String fileName){ 
     super(); 
     setSize(1365,725); 
     JLabel cross = new JLabel("+"); 
     JLabel display; 
     boolean feedback = myParticipant.getFeedbackTF(); 
     if(feedback){ 

      String v = syllogism.getSyllValidity(fileName); 
      if(v.equals("V")&&response==true||v.equals("I")&&response==false){ 
       display=new JLabel("Correct");   
      } 
      else{ 
       display=new JLabel("Incorrect"); 
      } 

      add(display); 
     } 
     else{ 
      add(cross); 
     } 
    } 
} 

,我認爲這個問題是在此位的代碼,但我想不通爲什麼:

public void actionPerformed(ActionEvent e) { 

     String name = s[currentTrial].getFN(); 

     boolean answerTF = false; 
     if(e.getSource()==s[currentTrial].yes){ 
      answerTF=true; 
     } 
     else if(e.getSource()==s[currentTrial].no){ 
      answerTF=false; 
     } 


     currentTrial++; 
     if(currentTrial>=s.length){ 
      cards.show(this, "end"); 
     } 
     else{ 
      add(new sylBetween(answerTF,name), "b"+currentTrial); 
      this.revalidate(); 
      cards.show(this, "b"+currentTrial); 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e1) { 
       System.err.println(e1); 
      } 
      cards.show(this,"Card"+currentTrial); 
     } 

    } 

謝謝!

回答

2

您正在使您的事件調度程序線程等待3秒鐘。這將停止響應,並且您的操作事件將不會返回到此時重新繪製。 檢查SwingUtilities的invokeLater(),你可以創建一個後臺線程並讓它休眠3秒鐘。一旦喚醒,使用swing實用方法,您可以編寫您的UI更新代碼,以便它將由EDT執行。