Como pausar?

Estou desenvolvendo um jogo da memoria para um trabalho da faculdade e estou com um problema e n consigo resolver

estou usando labels e o evento mouseClicked
o problema é o seguinte, quando clico na segunda carta(segundo label), faço ela ser mostrada no label(desvirda) e comprada com a primeira carta clicada
como na execução isso acontece muito rapido o usuario não tem tempo de ver a exibição da carta no segundo label
quero usar um método para travar(pausar) a execução por alguns segungos(2/3seg no max) antes q as cartas sejam comparadas para q o usuario possa ver a exibição

ja tentei varias formas e pesquisei muito, thread.sleep, ateh mesmo tentei realizar uma parada na gambiarra com um método

[code]
//método pausa, faz uma pause de n segundos
public void pausa(int n){
long t0, t1;

    t0 = System.currentTimeMillis();

    do{
        t1 = System.currentTimeMillis();
    }while ((t1 - t0) < (n * 1000)) ;
 }[/code]

mas o problema eh que quando chamo o método para pausar, seja ele esse ou ateh mesmo o thread.sleep ou outro
no momento do click o método de pausa eh chamado primerio doq os métodos de exibição e comparação das cartas
ou seja, quando clico na segunda carta, o sistema trava por 3 segundos(por exemplo) e depois faz as comparações e exibição

não sei como resolver isso, se eh problema em chamar o evento mouseClicked ou usar um label
n faço a minima idéai de como solucionar e ja tentei varias formas
se alguem souber alguma coisa ou tiver alguma idéia manda ai

esse é o código do evento mouseClicked dos meus labels se for preciso

[code]
//verifica se a carta ja não esta sendo exibida
if(cartas[0].getEstado()==false){
//verifica se o label está habilitado
if(lbCarta1.isEnabled()!=false){
//verifica se é o primeiro click
if(click<1){
//incrementa o numero de clicks para 1(um)
click=1;

            //mostra a carta clickada
            lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

            //salva a carta do primeiro click
            carta1 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());
        }
        //verifica se é o segundo click
        else if(click==1){

            //incrementa o numero de jogadas
            jogadas++;

            //preenche o campo das jogadas
            textJogadas.setText(jogadas.toString());

            //mostra a carta clickada
            lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

            //salva a carta do segundo click
            carta2 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());

            //-----
            //AQUI DEVERIA SER FEITA UMA PAUSA
            //-----

            //verifica se as cartas formam um par
            if(engine.verificaJogada(carta1, carta2)==true){//se sim

                //busca as cartas no array das cartas as salva dizendo que foram descobertas
                for(int i=0;i<cartas.length;i++){
                    if(carta1.getId()==cartas[i].getId())
                        cartas[i].setDescoberta(true);

                    if(carta2.getId()==cartas[i].getId())
                        cartas[i].setDescoberta(true);
                }

                //incrementa o score
                score=score+30;

                //preenche o campo dos pontos
                textPontos.setText(score.toString());
            }

            //retorna o numero de clicks para 0(zero)
            click=0;

            //verifica o fim do jogo
            if(engine.getFim(cartas)==true){
                //avisa fim do jogo
                Object[] opcoes1 = {"Sim", "Não"};
                int op = JOptionPane.showOptionDialog(null, "Fim do jogo!\n Continuar jogando?\n", "Fim de Jogo",
                                                      JOptionPane.YES_NO_OPTION,
                                                      JOptionPane.QUESTION_MESSAGE, null, opcoes1, opcoes1[0]);

                if(op==0){
                    cartas=engine.startJogo(dif, categ);

                    //faz o score final - score=score-(jogadas*2)
                    score=score-(jogadas*2);
                    //preenche o campo de pontos
                    textPontos.setText(score.toString());

                    //zera as jogadas
                    jogadas=0;
                    //preenche o campo das jogadas
                    textJogadas.setText(jogadas.toString());
                }
                else{
                    dispose();
                }
            }

            //vira as cartas novamente
            inicializaCartas();
        }
    }
    }[/code]

Dispara uma thread e só executa após um determinado tempo.

Simplifique! Adicione mais um clique. Por exemplo: 1o clique - vira a 1a carta, 2o clique - vira a segunda carta, 3o - clique se iguais retira, senão vira novamente!

De qualquer maneira, você pode acionar o componente javax.swing.Timer para contar o tempo. Ao virar a segunda carta você liga o timer, e no evento do timer você coloca o tratamento das cartas e o desligamento do timer.

@drsmachado
não sei implementar threads em java mas ja pegei uma pronta que faz isso que voce comentou
ela dava um start e fazia uma contagem de 3 segundos e apos isso voltava a execução do jogo normalmente

mas aconteceu o mesmo problema que descrevi no topic-post

@rmendes

não posso implementar um 3º clique, vai contra as regras do jogo, senão posso virar a segunda carta e ficar olhando para ela o tempo que quiser para decora-la

a questão do Timer ja implementei e não funcionou, aconteceu o mesmo problema q descrevi no topic-post

[quote]problema eh que quando chamo o método para pausar, seja ele esse ou ateh mesmo o thread.sleep ou outro
no momento do click o método de pausa eh chamado primerio doq os métodos de exibição e comparação das cartas
ou seja, quando clico na segunda carta, o sistema trava por 3 segundos(por exemplo) e depois faz as comparações e exibição [/quote]

Cara, to viajando … já tentou usar Thread.sleep() ?

também não funcionou, como ja falei no topic-post

consegui

fiz a thread começar apartir do momento do segundo click

[code]//verifica se a carta ja não esta sendo exibida
if(cartas[0].getEstado()==false){
//verifica se o label está habilitado
if(lbCarta1.isEnabled()!=false){
//verifica se é o primeiro click
if(click<1){
//incrementa o numero de clicks para 1(um)
click=1;

            //mostra a carta clickada
            lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

            //salva a carta do primeiro click
            carta1 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());
        }
        //verifica se é o segundo click
        else if(click==1){

            //começa uma thread que irá pausar a execução para
            new Thread(new Runnable(){
            public void run(){

            //incrementa o numero de jogadas
            jogadas++;

            //preenche o campo das jogadas
            textJogadas.setText(jogadas.toString());

            //mostra a carta clickada
            lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

            //salva a carta do segundo click
            carta2 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());

            //pausa a execução para as cartas serem exibidas
            try{
                Thread.sleep(1500);
            }catch (InterruptedException ex){
                Logger.getLogger(TelaJogoFacil.class.getName()).log(Level.SEVERE, null, ex);
            }

            //verifica se as cartas formam um par
            if(engine.verificaJogada(carta1, carta2)==true){//se sim

                //busca as cartas no array das cartas as salva dizendo que foram descobertas
                for(int i=0;i<cartas.length;i++){
                    if(carta1.getId()==cartas[i].getId())
                        cartas[i].setDescoberta(true);

                    if(carta2.getId()==cartas[i].getId())
                        cartas[i].setDescoberta(true);
                }

                //incrementa o score
                score=score+30;

                //preenche o campo dos pontos
                textPontos.setText(score.toString());
            }

            //retorna o numero de clicks para 0(zero)
            click=0;

            //verifica o fim do jogo
            if(engine.getFim(cartas)==true){
                //faz o score final - score=score-(jogadas*2)
                score=score-(jogadas*2);
                //preenche o campo de pontos
                textPontos.setText(score.toString());

                //avisa o fim do jogo
                Object[] opcoes1 = {"Sim", "Não"};
                int op = JOptionPane.showOptionDialog(null, "Fim do jogo!\n Continuar jogando?\n", "Fim de Jogo",
                                                      JOptionPane.YES_NO_OPTION,
                                                      JOptionPane.QUESTION_MESSAGE, null, opcoes1, opcoes1[0]);

                if(op==0){//se sim
                    cartas=engine.startJogo(dif, categ);

                    //zera as jogadas
                    jogadas=0;
                    //preenche o campo das jogadas
                    textJogadas.setText(jogadas.toString());
                }
                else{//se não
                    //pergunta se deseja salvar o score
                    Object[] opcoes2 = {"Sim", "Não"};
                    op = JOptionPane.showOptionDialog(null, "Deseja salvar o score?", "Salvar Score",
                                                    JOptionPane.YES_NO_OPTION,
                                                    JOptionPane.QUESTION_MESSAGE, null, opcoes2, opcoes2[0]);
                    //se sim
                    if(op==0)
                    {
                        String nome = JOptionPane.showInputDialog("Digite seu nome:");//pega o nome do jogador

                        if(nome==null || nome.equals(""))
                            dispose();
                        else
                        {
                            rank=new Rank();
                            jogador=new Jogador(score,nome);//cria o jogador
                            rank.addJogador(jogador);//e adiciona o jogador no rank
                        }
                    }
                    dispose();
                }
            }

            //vira as cartas novamente
            inicializaCartas();
        }//fim do run
        }).start();//fim da thread
        }//fim do segundo click
    }
    }[/code]