Problemas com JProgressBar

O meu JProgressBar não está sendo renderizado. Meu código é o seguinte, eu tenho um botão no meu formulário, chamado buscar, que abre uma caixa de seleção de arquivos e para o diretório selecionado, executo um método recursivo que faz o parser dos dados de arquivos XML que estão dentro da pasta, persistindo os dados no banco. Eu gostaria que a barra de progresso fosse renderizada enquanto o método estivesse em execução. Eu fiz da seguinte forma, mas não está funfando, ela não aparece no painel:

private void buscarActionPerformed(java.awt.event.ActionEvent evt) {                                       
    
    Persistencia p = new Persistencia();
    JFileChooser jFC = new JFileChooser();
    JProgressBar jPB = new JProgressBar();
    
    jFC.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    jPB.setAlignmentX(CENTER_ALIGNMENT);
    jPB.setAlignmentY(CENTER_ALIGNMENT);
    
    int selecao = jFC.showOpenDialog(null);
    
    if(selecao == JFileChooser.APPROVE_OPTION)
    {
        File f = jFC.getSelectedFile().getAbsoluteFile();
        PainelCarregamento.add(jPB);
        //jPB.setVisible(true);
        jPB.setIndeterminate(true);
        
        try 
        {
            p.cadastraNotaItem(f.listFiles());
            jPB.setIndeterminate(false);
            JOptionPane.showMessageDialog(rootPane, "Banco preenchido com sucesso!");
        } 
        catch (ParserConfigurationException | SAXException | IOException ex) 
        {
            JOptionPane.showMessageDialog(rootPane, "Diretório inválido. Insira o caminho correto.");
            Logger.getLogger(TelaInicio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    else
    {
        TelaInicio tI = new TelaInicio();
        
        tI.setVisible(true);
    }
    
}

Bom dia,

esse é um problema comum de thread. Você poderia criar uma thread para cadastrar os dados e usar os sinais Wait e Notify para sincronizar. Você conhece algo de threads?

Bom, eu conheço um pouco de programação paralela, mas em C, com pthreads. Vou ter que dar uma estudada para desembolar aqui em Java. Você tem algum material que seja simples? Ou algum tutorial? Código pronto? Hahaha. Obrigado! =]

Rsrs… Código pronto é bom né? Mas nem sempre é funcional. Bom é compreender os recursos da linguagem! Olha, apesar de ser em inglês, eu tenho um PDF que eu gosto. Se você quiser, manda um inbox que eu envio por e-mail. Por hora, e apesar de também ser em inglês, eu recomendo a documentação da Oracle sobre Threads:

https://docs.oracle.com/javase/tutorial/essential/concurrency/procthread.html

De qualquer forma, podemos elaborar uma solução por aqui. Você topa?

Tranquilo! Me manda o PDF sim… Vou ficar muito grato. Não tem importância ser em inglês não, camarada! Obrigado. Vou dar uma lida e tentar mais. Aí eu atualizo o post aqui com o que rolou. =D

Legal, mando sim! Eu criei uma solução para você, o interessante é estudar Thread para entender como fiz. Segue o código:

import java.awt.Dimension;

import javax.swing.JDialog;
import javax.swing.JProgressBar;


public class ProgressBar extends Thread {
	
	private JDialog dialog = null;
	
	@Override
	public void run() {
		super.run();
		JProgressBar bar = new JProgressBar();
		bar.setIndeterminate(true);
		dialog = new JDialog();
		dialog.setModal(true);		
		dialog.setSize(new Dimension(250, 40));
		dialog.setLocationRelativeTo(null);
		dialog.setUndecorated(true);
		dialog.add(bar);
		dialog.setVisible(true);		
	}

	public void iniciaBar() {
		start();
	}
	
	public void paraBar() {
		dialog.setVisible(false);
		dialog.dispose();
	}	

}

Depois que você criar a classe no seu projeto, usar fica fácil:

ProgressBar bar = new ProgressBar();
bar.iniciaBar();
// efetua as operações. Obs.: enquanto isso a ProgressBar fica visível na tela.
bar.paraBar();

Obrigado! Cara eu tentei usar o seu método, a barra é renderizada, mas ela fica visível infinitamente. Tipo, parece que entra num loop infinito, ela aparece, fica carregando, mas nada de código que vem abaixo da chamada bar.inicia() é executado. Meu método que realiza as operações não é alcançado… Você tem ideia do que pode ser? Abraço!

Opa! Tudo bom? De nada cara. Vamos lá… Você criou a classe ProgressBar separadamente do código principal? Ela precisa estar separada porque ela starta uma thread própria, caso contrário vai travar do jeito que você falou.

Sim. Ela está no meu pacote de classes. E eu instancio ela no meu JFrame para utilizar os métodos, que está em outro pacote.

Realmente nessa situação que você descreveu não funcionou. Experimenta fazer a seguinte alteração:

new Thread(new Runnable() {
	@Override
	public void run() {
		ProgressBar bar = new ProgressBar();
		bar.iniciaBar();
		// efetua as operações. Obs.: enquanto isso a ProgressBar fica visível na tela.
		bar.paraBar();
	}
}).start();

Certo mas essa new Thread eu declaro no meu JFrame ou na minha classe ProgressBar?

Cara, muito obrigado meeeesmo! Consegui aqui. Você pode me explicar o porque dessa new Thread? Para eu documentar aqui no serviço. Valeu demais velho. =]

Que bom que funcionou! De nada Alberto. Você pode escrever que “new Thread” instancia a thread que executa a operação da classe de cadastro. É o mesmo que:

Thread t = new Thread(new Runnable() {  
    @Override  
    public void run() {  
        ProgressBar bar = new ProgressBar();  
        bar.iniciaBar();  
        // efetua as operações. Obs.: enquanto isso a ProgressBar fica visível na tela.  
        bar.paraBar();  
    }  
});
t.start(); 

Oi Alberto

você teria como me passar a sua solução? tô passando pelo mesmo problema

desde ja agradeço!

@Sara_Oliveiras

O ultimo tramite deste cara foi no dia 30 de Julho de 2015, duvido que te responderá, recomendo criar um tópico informando qual o problema e com seu código.

depois que eu mandei, que fui notar esse detalhe! :sweat:

muito obrigada!