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:
privatevoidbuscarActionPerformed(java.awt.event.ActionEventevt){Persistenciap=newPersistencia();JFileChooserjFC=newJFileChooser();JProgressBarjPB=newJProgressBar();jFC.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);jPB.setAlignmentX(CENTER_ALIGNMENT);jPB.setAlignmentY(CENTER_ALIGNMENT);intselecao=jFC.showOpenDialog(null);if(selecao==JFileChooser.APPROVE_OPTION){Filef=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|IOExceptionex){JOptionPane.showMessageDialog(rootPane,"Diretório inválido. Insira o caminho correto.");Logger.getLogger(TelaInicio.class.getName()).log(Level.SEVERE,null,ex);}}else{TelaIniciotI=newTelaInicio();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?
A
Alberto_Passini
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! =]
J
jcnborges
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:
De qualquer forma, podemos elaborar uma solução por aqui. Você topa?
A
Alberto_Passini
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
J
jcnborges
Legal, mando sim! Eu criei uma solução para você, o interessante é estudar Thread para entender como fiz. Segue o código:
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();
A
Alberto_Passini
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!
J
jcnborges
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.
A
Alberto_Passini
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.
J
jcnborges
Realmente nessa situação que você descreveu não funcionou. Experimenta fazer a seguinte alteração:
newThread(newRunnable(){@Overridepublicvoidrun(){ProgressBarbar=newProgressBar();bar.iniciaBar();// efetua as operações. Obs.: enquanto isso a ProgressBar fica visível na tela.bar.paraBar();}}).start();
A
Alberto_Passini
Certo mas essa new Thread eu declaro no meu JFrame ou na minha classe ProgressBar?
A
Alberto_Passini
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. =]
J
jcnborges
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:
Threadt=newThread(newRunnable(){@Overridepublicvoidrun(){ProgressBarbar=newProgressBar();bar.iniciaBar();// efetua as operações. Obs.: enquanto isso a ProgressBar fica visível na tela. bar.paraBar();}});t.start();
S
Sara_Oliveiras
Oi Alberto
você teria como me passar a sua solução? tô passando pelo mesmo problema
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.