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);
}
}
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:
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
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.
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();
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();
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.