Barra de progresso, thread e o método .dispose() [RESOLVIDO]

Olá amigos, estou com o seguinte problema em um JDialog,

preciso realizar o processo abaixo por N vezes

parte 1: criar um arquivo tipo texto
parte 2: chamar um arquivo .exe para ler o arquivo
parte 3: ler o arquivo de saída do .exe da parte 2

Estou pensando em fazer tudo isso dentro de um JDialog que mostre uma barra de progresso e usar um thread para caso o arquivo .exe trave, dê para fechar a janela apertando um botão Cancelar por exemplo.

Eu coloquei tudo no método executar() , que chamo lá no construtor do JDialog, mas quando acaba tudo, o comando .dispose() que fica no final do método executar() não é executado.

Será que a minha lógica está errada ou o método .dispose() não é executado “sozinho”? Pois eu quero que o JDialog abra, execute e feche sozinho.

Abração!

Códigos please.

Oi,

Coloque um Sysout antes e depois do método dispose(). Verifique se realmente está passando por ali.

Obs.: Se sua janela é setModal(true) e você está colocando á chamado do dispose() abaixo do método setVisible(true), pode esperar para sempre…

Tchauzin!

pra resumir o problema, eu editei esse post e resumi os códigos que realmente interessam, ficando mais fácil de entender

o construtor do JDialog que tem a barra de progresso e o botão Cancelar para interromper a thread

/** Creates new form JanelaExecutaCortebi */
    public JanelaExecuta(java.awt.Frame parent, boolean modal, 
            ArrayList<Placa> placas, JanelaMontagemLotes jan)
    {
        super(parent, modal);
        initComponents();

        this.jan = jan;

        executar(placas);

    }

método executar que não fecha o JDialog

    public void executar(ArrayList<Placa> placas)
    {

        // aqui é colocado o thread que é executado normalmente
        

        //quando termina a execução do thread, o comando abaixo não é processado
        this.dispose(); 
     
    }

oi lina, eu chamo o JDialog a partir de um outro:

         JanelaExecutaCortebi janExec = new JanelaExecutaCortebi(parent, true, placas, this);
            janExec.setLocationRelativeTo(this);
            janExec.setVisible(true);

coloquei um JOptionPane depois do dispose() e apareceu normal. ( só o dispose que não está sendo executado)

Oi,

E se você colocar:

Na criação de seu JDialog ?

Tchauzin!

oi lina, na verdade está como DISPOSE_ON_CLOSE (que é colocado por default pelo Netbeans) , mas continua com o mesmo problema

o comando dispose() só é executado quando eu o chamo a partir de um evento, por exemplo, clicar um botão fechar

mas eu queria que o JDialog fechasse sozinho após executar os comandos do método executar();

Boas amigos! consegui resolver meu problema!

Na verdade a parte de thread está funcionando bem, o problema era que quando o JDialog terminava os cálculos, ele não fechava sozinho.

Resolvi utilizando um Timer no final do método que realizava as tarefas, e setei para um tempo bem pequeno, porque quero que o JDialog feche imediatamente após executar a tarefa.

Deste modo pode-se utilizar o JDialog normalmente, inclusive com o modal sendo true. Seque o código do timer que pode ser colocado para fechar um JDialog (e provavelmente também JFrames e afins) de maneira automática

    
         int tempo = 100; //valor pequeno para fechar o JDialog rapidamente após executar as tarefas

        Timer timer = new Timer(tempo, new ActionListener()
        {
            public void actionPerformed(ActionEvent ev)
            {
                dispose();
            }
        });

        timer.setRepeats(false);
        timer.start();

Obs: Caso usem este meu método, e o JDialog aparecer só depois do thread realizar a tarefa, basta colocar um timer no construtor também, para simular um evento “iniciar processo”, daí o JDialog vai aparecer do início ao fim do processamento da tarefa.

Obrigado a lina e ao ViniGodoy que tentaram ajudar e um abraço aos demais :smiley: