How to close a JDialog after finishing executing a Thread?

5

I have a configuration window that opens on the first run of the application I'm developing. After typing the directories that the application will run the user clicks save, some tests are run and finally a Thread runs.

I would like to have the configuration window closed by itself after finishing execution of this Thread, but I tried to run dispose() and setVisible() and it disappears before running Thread.

// Evento para salvar os diretórios
btnSalvar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {

        // Testa o campo com o diretório a ser indexado
        // Se está vazio
        if ((txtDirIndexado.getText().length() == 0 || Character
                .toString(txtDirIndexado.getText().charAt(0)).equals(
                        " "))) {
            JOptionPane
                    .showMessageDialog(panel,
                            "O campo com o diretório a ser indexado não pode estar em branco.");
        } else if ((txtDirIndice.getText().length() == 0 || Character
                .toString(txtDirIndexado.getText().charAt(0)).equals(
                        " "))) {
            JOptionPane
                    .showMessageDialog(panel,
                            "O campo com o diretório que guardará o índice não pode estar em branco.");

        } else {
            try {
                ArquivoDeConfiguracao.defineFonte(txtDirIndexado.getText());
                ArquivoDeConfiguracao.defineIndice(txtDirIndice.getText());
                ArquivoDeConfiguracao.definePrimeiraExecucao(1);
                // Janela de aguardo
                final JDialog janelaProgresso = new IndexAndo();

                // Cria um novo processo e mostra a janela
                new Thread(new Runnable() {
                    public void run() {
                        Indexador ind = new Indexador();
                        ind.iniciaIndexacao();

                        // Ao terminar fecha
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                janelaProgresso.setVisible(false);
                            }
                        });
                    }
                }).start();
                // Salva a data
                dispose();
                ArquivoDeConfiguracao.defineIndiceUltAtualizacao();
            } catch (IOException e) {
                // Gera erro
                e.printStackTrace();
            }
        }
    }

});

The code is fully can be accessed in git .

Edition:

// Evento para salvar os direstórios
btnSalvar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        // Testa o campo com o diretório a ser indexado
        // Se está vazio
        if ((txtDirIndexado.getText().length() == 0 || Character
                .toString(txtDirIndexado.getText().charAt(0)).equals(
                        " "))) {
            JOptionPane
                    .showMessageDialog(panel,
                            "O campo com o diretório a ser indexado não pode estar em branco.");
            // Se está vazio
        } else if ((txtDirIndice.getText().length() == 0 || Character
                .toString(txtDirIndexado.getText().charAt(0)).equals(
                        " "))) {
            JOptionPane
                    .showMessageDialog(panel,
                            "O campo com o diretório que guardará o índice não pode estar em branco.");
            // Se o diretório existe
        } else {
            try {
                ArquivoDeConfiguracao.defineFonte(txtDirIndexado.getText());
                ArquivoDeConfiguracao.defineIndice(txtDirIndice.getText());
                ArquivoDeConfiguracao.definePrimeiraExecucao(1);

                final JDialog janelaProgresso = new IndexAndo();

                new Thread(new Runnable() {
                    public void run() {
                        ProcessoIndexacao base = new ProcessoIndexacao();
                        base.start();
                        synchronized (base){
                            try {
                                base.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        SwingUtilities.invokeLater(new Runnable() {
                            public void run() {
                                janelaProgresso.setVisible(false);
                            }
                        });
                    }
                }).start();
                janelaProgresso.setVisible(true);
                // Salva a data
                ArquivoDeConfiguracao.defineIndiceUltAtualizacao();
            } catch (IOException e) {
                // Gera erro
                e.printStackTrace();
            }
        }
        dispose();
    }
public class ProcessoIndexacao extends Thread{
    public void run(){
        synchronized (this){
            Indexador ind = new Indexador();
            ind.iniciaIndexacao();
            notify();
        }
    }
}
    
asked by anonymous 15.04.2014 / 18:51

2 answers

4

I did not see your whole code, but if I understood your problem well you want one thread to wait for another to finish.

Basically what you need is to understand the concepts of wait() and notify() .

Here is an example that I implemented while studying for the Java certification exam:

public class WaitNotify {
    public static void main(String[] args) {
        //aqui você inicia uma nova Thread e manda ela rodar
        ThreadB b = new ThreadB();
        b.start();
        //Thread atual deve ter o "lock" da thread b,isso é necessário para chamar o wait()
        synchronized(b) {
            System.out.print("Waiting for b to complete...");
            try {
                //aqui você diz que a Thread atual deve esperar a Thread b terminar
                b.wait();
            } catch(InterruptedException e) { 
                e.printStackTrace();
            }
            System.out.println("Total is: " + b.total);
        }
    }
}

class ThreadB extends Thread {
    int total;
    //aqui sua Thread começa a rodar
    @Override
    public void run() {
        synchronized(this) {
            for(int i=0; i<16; i++) {
                total += i;
                try {
                    //um temporizador para sua Thread não acabar na velocidade da luz!
                    Thread.sleep(300);
                } catch(InterruptedException e) { 
                    e.printStackTrace();
                }
                //faz uma frescura
                if(i%2 == 0) {
                    System.out.print(".");
                }
            }
            System.out.println();
            //Thread avisa que terminou sua execução para quem possui o lock de b
            notify();
        }
    }
}

Remember that when you run a class that has a main() method you are running a thread that is named main , just like in the example above, the main in> is a thread like any other, so just make it wait for another thread until it calls the notify() .

    
15.04.2014 / 19:15
0

I was able to solve my problem with the command below:

myJDialog.getOwner().dispose();

According to the documentation, this method has existed since version 1.2 of java.

    
15.10.2016 / 02:29