seguinte crei um programa de importacao para um banco de dados atraves de um arquivo de texto, ta funcionando file so que ta com um probleminha chato, criei um Jlabel e nele coloco um .settext(totalimport) com um contador que vai aumentando cada vez q insere um novo registro no banco, so que pensei que ele iria ficar mostrando a quantidade de registro ele ja importou como um contador porem ele so exibe o resultado quando termina o processo e nao a cada registro inserido, fiz com um System.out.println(totalimport+"") e ele mostra do jeito que eu queria porem quero com um Jlabel, ai vai meu codigo.
[code]public void lerDados(){
try {
BufferedReader leitor = new BufferedReader(new FileReader("C://conteudo.txt"));
String linha;
while((linha = leitor.readLine())!= null) // enquanto existir algo para ler
{
try{
conecUsuarios.statement.execute("INSERT INTO usuarios (nome, endereco, bairro, cidade, uf) VALUES ('"+linha.substring(nomei,nomef).trim()+"' , '"+linha.substring(enderecoi,enderecof).trim()+"' , '"+linha.substring(bairroi,bairrof).trim()+"' , '"+linha.substring(cidadei,cidadef).trim()+"' , '"+linha.substring(ufi,uff).trim()+"')");
//JOptionPane.showMessageDialog(null, linha.substring(nomei,nomef).trim()+"\n"+linha.substring(enderecoi,enderecof).trim()+"\n"+linha.substring(bairroi,bairrof).trim()+"\n"+linha.substring(cidadei,cidadef).trim()+"\n"+linha.substring(ufi,uff).trim());
JL_TOTALIMPORTADOS.setText(totalimport+"");//AQUI ELE VAI MOSTRAR NO JLABEL O QUANTO JA IMPORTOU
totalimport = totalimport +1 ;//AQUI AUMENTA O CONTADOR
}catch(SQLException erro){
JOptionPane.showMessageDialog(null, erro);
}
}
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e);
}
Sim, você precisa atualizar o seu contador numa thread separada.
Aliás, seria bom que vc rodasse todo esse processo numa thread separada.
Dê uma olhada na classe SwingWorker se for Java 6.
Aproveitando, dá uma olhada também na classe PreparedStatement. Concatenar SQL com o sinal de + não só deixa o código muito poluído como também é inseguro. Permite que o seu usuário faça o ataque de SQL Injection.
Murilo, você só empilhou um evento na thread do Swing. Mas não criou nenhuma thread nova.
Como o código dele já roda na thread do Swing, sua modificação não surtirá efeito algum.
Agora, vc pode reescrever a função assim:
// metodo usando uma thread para atualizar o JLabel
public void apresentaStatus(final JLabel label1, final Integer status){
try{
new Thread(new Runnable() {
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
label1.setText(status.toString());
}
});
}).start();
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Isso deve funcionar, mas a barra pode ficar um pouco louca, já que não garantimos a ordem de execução das threads.
O ideal mesmo, é criar uma thread só, e mover todo aquele código para dentro dela.
Tentei muito e não consegui criar uma Thread mas porque não entendo muito de Thread vou ate pegar um livro e vou estudar afinal isso é muito importante , usei um componente chamado TimeBeans que trabalha como uma Thread so que tambem permite que seja executado a mesma Thread varias vezes por um determinado espaço de tempo ou somente uma vez, no caso usei o TimeBeans no meu botao ai resolveu mas não considero a forma correta.
Sera que alguem poderia criar uma Thread como nesses exemplo dentro de uma mesma classe nesse exemplo ficaria agradecido
int i = 0;
public void mostrarContador(){
i = 0;
while(i <= 1000){
i = i + 1;
MEUJLABEL.settext(i);
}
}
public void metodoThread(){
mostrarContador;//vaiexecutar esse metodo na Thread
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //SE COLOCAR O METODO mostrarContador ELE SO VAI MOSTRAR QUANDO TERMINAR O CONTADOR
metodoThread();
}