当我使用睡眠时,JPanel没有正确更新CardLayout

时间:2012-02-08 19:28:41

标签: java swing sleep cardlayout

我编写了一个使用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);
        }

    }

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在使事件调度程序线程等到3秒。这将停止响应,您的动作事件将不会返回,直到这次重新绘制。 检查SwingUtilities invokeLater(),您可以创建一个后台线程并让它休眠3秒钟。一旦它醒来,使用swing实用程序方法,你可以编写你的UI更新代码,以便它将由EDT执行。