JPanel не обновляет CardLayout должным образом, когда я использую сон - PullRequest
0 голосов
/ 08 февраля 2012

Я написал программу, которая использует 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 Ответ

2 голосов
/ 08 февраля 2012

Вы заставляете ваш поток диспетчера событий ждать до 3 секунд.Это остановит ответ, и ваше действие не вернется назад до этого времени, чтобы сделать перерисовку.Проверьте SwingUtilities invokeLater (), вы можете создать фоновый поток и заставить его спать в течение 3 секунд.как только он пробудится, используя свинг-утилиты, вы можете написать свой код обновления пользовательского интерфейса, чтобы он выполнялся EDT.

...