2012-02-08 4 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秒間スリープさせることができます。それが起きたら、スイングユーティリティメソッドを使ってEDTによって実行されるようにUI更新コードを書くことができます。

関連する問題