0

CardLayout を使用するプログラムを作成しました。JPanel を表示してから、ユーザーの入力に基づいて新しい JPanel を表示し、3 秒間一時停止してから、ユーザー入力が必要な別の JPanel を表示します。

ユーザー入力を必要とする 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);
        }

    }

ありがとう!

4

1 に答える 1

2

イベント ディスパッチャ スレッドを 3 秒まで待機させています。これにより応答が停止し、アクション イベントはこの時点まで戻って再描画を行いません。SwingUtilities の invokeLater() を確認すると、バックグラウンド スレッドを作成して 3 秒間スリープさせることができます。起動したら、swing ユーティリティ メソッドを使用して、EDT によって実行されるように UI 更新コードを記述できます。

于 2012-02-08T19:52:27.087 に答える