Barra de Progresso Durante Processo de Importação .CSV

Eu tenho o seguinte código abaixo, que está funcionando direitinho, ele pela a planilha .csv e joga no banco. Porém queria colocar uma barra de progresso, vi uns sites e vídeos de como fazer, mas nestes só mostram valores pegados de botões, ou valores fixos, não achei nada com while por exemplo.

No no meu código abaixo eu colocaria a barra de progresso, e em que local a medida que fosse colocando no banco, a barra fosse sendo atualizada e mostrando valor até chegar em 100%, se marcarem onde colocar a barra e como fazer essa atualização, eu consigo resolver. O problema é que não sei onde coloca-la.

//------código-----

JFileChooser fc = new JFileChooser(); // Logger.getLogger(ListaNcm.class.getName()).log(Level.SEVERE, null, err);
        int res = fc.showOpenDialog(null);
        if (res == JFileChooser.APPROVE_OPTION) {
            File arquivo = fc.getSelectedFile();
            
            JOptionPane.showMessageDialog(null,"O processo de importação poderá demorar um pouco.\nAssim que estiver concluído irei exibir uma mensagem de conclusão","",JOptionPane.INFORMATION_MESSAGE);
            int batchSize = 20;

            conecta_contaContab = new ConexaoBD();
            conecta_contaContab.conecta();

        try{
               
                PreparedStatement pstmt = conecta_contaContab.conexao.prepareStatement("Truncate table con_cnae01");
                pstmt.execute();

                String sql = "INSERT INTO con_pcc01 (codigoExpandido,codigoReduzido,grupo,tipo,nomePlanoConta,naturezaPlanConta,dataInclusao,drePlanConta) VALUES (?,?,?,?,?,?,?,?)";
                PreparedStatement statement = conecta_contaContab.conexao.prepareStatement(sql);

                BufferedReader lineReader = new BufferedReader(new FileReader(arquivo));
                String lineText = null;

                int count = 0;

                lineReader.readLine(); // skip header line
                
                while ((lineText = lineReader.readLine()) != null) {
 
                    String[] data = lineText.split(";");
                    String codigoExpan = data[0];
                    String codigoReduz = data[1];
                    String grupoConta = data[2];
                    String tipoConta = data[3];
                    String nomePlano = data[4];
                    String naturezaPlan = data[5];
                    String dataIncluso = data[6];
                    String tipoDre = data.length == 8 ? data[7] : "";

                    statement.setString(1, codigoExpan);
                    statement.setString(2, codigoReduz);
                    statement.setString(3, grupoConta);
                    statement.setString(4, tipoConta);
                    statement.setString(5, nomePlano);
                    statement.setString(6, naturezaPlan);
                    statement.setDate(7, java.sql.Date.valueOf(dataIncluso));
                    statement.setString(8, tipoDre);

                    statement.addBatch();
                    
                    if (count % batchSize == 0) {
                        statement.executeBatch();
                        
                conecta_contaContab.conecta();
                conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
                mostrar_tabela();
                    }
                }      
                lineReader.close();       
                // execute the remaining queries
                statement.executeBatch();
                conecta_contaContab.conexao.close();
                JOptionPane.showMessageDialog(null,"Importação realizada com sucesso","",JOptionPane.INFORMATION_MESSAGE);
                conecta_contaContab = new ConexaoBD();
                conecta_contaContab.conecta();
                conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
                mostrar_tabela();
                // Atualiza a Barra de Progresso
       
            } catch (IOException ex) { 
                JOptionPane.showMessageDialog(null,"Erro ao importar: "+ex,"",JOptionPane.ERROR_MESSAGE);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null,"Erro ao importar: "+ex,"",JOptionPane.ERROR_MESSAGE);
                try {
                    conecta_contaContab.conexao.rollback();
                } catch (SQLException e) {
                    JOptionPane.showMessageDialog(null,"Erro ao importar: "+e,"",JOptionPane.ERROR_MESSAGE);
            }  
          }
            conecta_contaContab.conecta();

    }else{
     }

Veja um exemplo:

public class MainProgressBar extends JFrame {
	private static final long serialVersionUID = 1L;
	
	private JProgressBar progress;

	public MainProgressBar() {
		super("Progressbar");
		
		initComponents();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		pack();
		setVisible(true);
		
		startProcess();
	}

	private void startProcess() {
		Thread thread = new Thread(() -> {
			int total = 10; // total de registros a serem processados
			int atual = 0; // registro atual
			
			while(atual <= total) {
				int percent = (atual * 100) / total;
				progress.setValue(percent);
				
				// SEU PROCESSAMENTO VAI AQUI
				atual++;
				
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				// SEU PROCESSAMENTO VAI AQUI
			}
			
			System.exit(0);
		});
		
		thread.start();
	}

	private void initComponents() {
		progress = new JProgressBar();
		progress.setSize(350, 40);
		add(progress);
	}
	
	public static void main(String[] args) {
		new MainProgressBar();
	}
}

Tenta assim:

JFileChooser fc = new JFileChooser();
int res = fc.showOpenDialog(null);
if (res == JFileChooser.APPROVE_OPTION) {
    File arquivo = fc.getSelectedFile();

    JOptionPane.showMessageDialog(null, "O processo de importação poderá demorar um pouco.\nAssim que estiver concluído irei exibir uma mensagem de conclusão", "", JOptionPane.INFORMATION_MESSAGE);
    int batchSize = 20;

    conecta_contaContab = new ConexaoBD();
    conecta_contaContab.conecta();

    try {
        PreparedStatement pstmt = conecta_contaContab.conexao.prepareStatement("Truncate table con_cnae01");
        pstmt.execute();

        String sql = "INSERT INTO con_pcc01 (codigoExpandido,codigoReduzido,grupo,tipo,nomePlanoConta,naturezaPlanConta,dataInclusao,drePlanConta) VALUES (?,?,?,?,?,?,?,?)";
        PreparedStatement statement = conecta_contaContab.conexao.prepareStatement(sql);

        // ler linhas do arquivo
        int count = 0;
        List<String> lines = Files.readAllLines(arquivo.toPath());
        lines.remove(0); // skip header line

        // preparar progressbar
        meuProgressBar.setMinimum(0);
        meuProgressBar.setMaximum(lines.size());
        meuProgressBar.setValue(0);

        for (String lineText : lines) {

            String[] data = lineText.split(";");
            String codigoExpan = data[0];
            String codigoReduz = data[1];
            String grupoConta = data[2];
            String tipoConta = data[3];
            String nomePlano = data[4];
            String naturezaPlan = data[5];
            String dataIncluso = data[6];
            String tipoDre = data.length == 8 ? data[7] : "";

            statement.setString(1, codigoExpan);
            statement.setString(2, codigoReduz);
            statement.setString(3, grupoConta);
            statement.setString(4, tipoConta);
            statement.setString(5, nomePlano);
            statement.setString(6, naturezaPlan);
            statement.setDate(7, java.sql.Date.valueOf(dataIncluso));
            statement.setString(8, tipoDre);

            statement.addBatch();

            // atualizar progressbar
            count++;
            try {
                final int progresso = count;
                SwingUtilities.invokeAndWait(() -> meuProgressBar.setValue(progresso));
            } catch (Exception e) {
                e.printStackTrace();
            }

            if (count % batchSize == 0) {
                statement.executeBatch();

                conecta_contaContab.conecta();
                conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
                mostrar_tabela();
            }
        }

        // execute the remaining queries
        statement.executeBatch();
        conecta_contaContab.conexao.close();
        JOptionPane.showMessageDialog(null, "Importação realizada com sucesso", "", JOptionPane.INFORMATION_MESSAGE);
        conecta_contaContab = new ConexaoBD();
        conecta_contaContab.conecta();
        conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
        mostrar_tabela();
        // Atualiza a Barra de Progresso

    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
        try {
            conecta_contaContab.conexao.rollback();
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro ao importar: " + e, "", JOptionPane.ERROR_MESSAGE);
        }
    }
    conecta_contaContab.conecta();
}

Deu erro :
Exception in thread “AWT-EventQueue-0” java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1331)
at java.awt.EventQueue.invokeAndWait(EventQueue.java:1324)
at javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1353)
at Contabil.CadastroPlanoContas.botaoImportarPlanoActionPerformed(CadastroPlanoContas.java:621)
Nessa na linha em negrito:

count++;
try {
final int progresso = count;
SwingUtilities.invokeAndWait(() -> barraProgresso.setValue(progresso));//O errro está nessa linha
} catch (Exception e) {
e.printStackTrace();
}

Isso significa que esse teu processo aí está já executando dentro da Thread de eventos do AWT, achei que era em uma Thread separada.

Então não precisa usar o SwingUtilities, faz simplesmente:

barraProgresso.setValue(count);

:slight_smile:

O erro sumiu, o processo de importação dá certo porém a barra fica em 0% o todo todo, aí só quando termina que aparece em 100%.

Eu tentei fazer isso aqui:

Criei um método

Runnable runner = new Runnable() {
public void run() {
// Obtém o resultado atual da Barra
int valor = prbConta.getValue();
// Atualiza a Barra
prbConta.setValue(valor+1);
}
};

e no try - cacth que atualiza coloquei isso:

count++;
try {
final int progresso = count;
SwingUtilities.invokeAndWait(() -> prbConta.setValue(progresso));
} catch (Exception e) {
e.printStackTrace();
}

tentei tmbm com

try {
SwingUtilities.invokeAndWait(runner);
} catch (java.lang.reflect.InvocationTargetException e) {
break;
} catch (InterruptedException e) {
}

Mas nenhuma das duas formas deu certo

Isso não é um método, é uma classe anônima que implementa Runnable.

Se usar expressão lambda ficaria assim:

Runnable runner = () -> {
        // Obtém o resultado atual da Barra
        int valor = prbConta.getValue();
        // Atualiza a Barra
        prbConta.setValue(valor+1);
};

Ou, de forma mais reduzida, assim:

Runnable runner = () -> prbConta.setValue(prbConta.getValue() + 1);

Resumindo, seu runner é a mesma coisa que a expressão lambda que eu já havia sugerido.
:smiley:

Faz o seguinte, tenta fazer assim:

// atualizar progressbar
count++;
try {
    new Thread(() -> SwingUtilities.invokeAndWait(() -> prbConta.setValue(prbConta.getValue() + 1))).start();
} catch (Exception e) {
    e.printStackTrace();
}

Se der pau no invokeAndWait, tenta usar o invokeLater.

A barra ainda não anda, é como se ela estivesse fora do laço, por isso o valor não ta sendo atualizado…

Será que se criar algo assim, e colocar ela dentro funciona?
// declarando Thread
private Thread worker;

worker = new Thread(

      new Runnable() {

        public void run() {

}
});
worker.start();

Acredito que sim, tenta aí:

Runnable runner = new Runnable() {

    @Override
    public void run() {
        JFileChooser fc = new JFileChooser();
        int res = fc.showOpenDialog(null);
        if (res == JFileChooser.APPROVE_OPTION) {
            File arquivo = fc.getSelectedFile();

            JOptionPane.showMessageDialog(null, "O processo de importação poderá demorar um pouco.\nAssim que estiver concluído irei exibir uma mensagem de conclusão", "", JOptionPane.INFORMATION_MESSAGE);
            int batchSize = 20;

            conecta_contaContab = new ConexaoBD();
            conecta_contaContab.conecta();

            try {
                PreparedStatement pstmt = conecta_contaContab.conexao.prepareStatement("Truncate table con_cnae01");
                pstmt.execute();

                String sql = "INSERT INTO con_pcc01 (codigoExpandido,codigoReduzido,grupo,tipo,nomePlanoConta,naturezaPlanConta,dataInclusao,drePlanConta) VALUES (?,?,?,?,?,?,?,?)";
                PreparedStatement statement = conecta_contaContab.conexao.prepareStatement(sql);

                // ler linhas do arquivo
                int count = 0;
                List<String> lines = Files.readAllLines(arquivo.toPath());
                lines.remove(0); // skip header line

                // preparar progressbar
                prbConta.setMinimum(0);
                prbConta.setMaximum(lines.size());
                prbConta.setValue(0);

                for (String lineText : lines) {

                    String[] data = lineText.split(";");
                    String codigoExpan = data[0];
                    String codigoReduz = data[1];
                    String grupoConta = data[2];
                    String tipoConta = data[3];
                    String nomePlano = data[4];
                    String naturezaPlan = data[5];
                    String dataIncluso = data[6];
                    String tipoDre = data.length == 8 ? data[7] : "";

                    statement.setString(1, codigoExpan);
                    statement.setString(2, codigoReduz);
                    statement.setString(3, grupoConta);
                    statement.setString(4, tipoConta);
                    statement.setString(5, nomePlano);
                    statement.setString(6, naturezaPlan);
                    statement.setDate(7, java.sql.Date.valueOf(dataIncluso));
                    statement.setString(8, tipoDre);

                    statement.addBatch();

                    // atualizar progressbar
                    count++;
                    try {
                        SwingUtilities.invokeLater(() -> prbConta.setValue(prbConta.getValue() + 1));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    if (count % batchSize == 0) {
                        statement.executeBatch();

                        conecta_contaContab.conecta();
                        conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
                        mostrar_tabela();
                    }
                }

                // execute the remaining queries
                statement.executeBatch();
                conecta_contaContab.conexao.close();
                JOptionPane.showMessageDialog(null, "Importação realizada com sucesso", "", JOptionPane.INFORMATION_MESSAGE);
                conecta_contaContab = new ConexaoBD();
                conecta_contaContab.conecta();
                conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
                mostrar_tabela();
                // Atualiza a Barra de Progresso

            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
                try {
                    conecta_contaContab.conexao.rollback();
                } catch (SQLException e) {
                    JOptionPane.showMessageDialog(null, "Erro ao importar: " + e, "", JOptionPane.ERROR_MESSAGE);
                }
            }
            conecta_contaContab.conecta();
        }
    }
};
try {
    Thread thread = new Thread(runner);
    thread.start();
    thread.join();
} catch (InterruptedException e) {
    e.printStackTrace();
}
1 curtida

Staroski,

Consegui. Muito Obrigado pela sua ajuda…

Eu fiz diferente deste último código que vc mandou, e coloquei aquilo que achava que tinha que pôr mesmo:

worker = new Thread(
new Runnable() {
public void run() {
});
worker.start();

O Código correto ficou assim, e está funcionando 100% :slight_smile:

JFileChooser fc = new JFileChooser();
int res = fc.showOpenDialog(null);
if (res == JFileChooser.APPROVE_OPTION) {
File arquivo = fc.getSelectedFile();

JOptionPane.showMessageDialog(null, "O processo de importação poderá demorar um pouco.\nAssim que estiver concluído irei exibir uma mensagem de conclusão", "", JOptionPane.INFORMATION_MESSAGE);
int batchSize = 20;

conecta_contaContab = new ConexaoBD();
conecta_contaContab.conecta();

    worker = new Thread(    
      new Runnable() {
        public void run() {
         try {
    PreparedStatement pstmt = conecta_contaContab.conexao.prepareStatement("Truncate table con_cnae01");
    pstmt.execute();

    String sql = "INSERT INTO con_pcc01 (codigoExpandido,codigoReduzido,grupo,tipo,nomePlanoConta,naturezaPlanConta,dataInclusao,drePlanConta) VALUES (?,?,?,?,?,?,?,?)";
    PreparedStatement statement = conecta_contaContab.conexao.prepareStatement(sql);

    // ler linhas do arquivo
    int count = 0;
    List<String> lines = Files.readAllLines(arquivo.toPath());
    lines.remove(0); // skip header line

    // preparar progressbar
    barraProgresso.setMinimum(0);
    barraProgresso.setMaximum(lines.size());
    barraProgresso.setValue(0);

    for (String lineText : lines) {

        String[] data = lineText.split(";");
        String codigoExpan = data[0];
        String codigoReduz = data[1];
        String grupoConta = data[2];
        String tipoConta = data[3];
        String nomePlano = data[4];
        String naturezaPlan = data[5];
        String dataIncluso = data[6];
        String tipoDre = data.length == 8 ? data[7] : "";

        statement.setString(1, codigoExpan);
        statement.setString(2, codigoReduz);
        statement.setString(3, grupoConta);
        statement.setString(4, tipoConta);
        statement.setString(5, nomePlano);
        statement.setString(6, naturezaPlan);
        statement.setDate(7, java.sql.Date.valueOf(dataIncluso));
        statement.setString(8, tipoDre);

        statement.addBatch();

        // atualizar progressbar
        try {
            new Thread(() -> SwingUtilities.invokeLater(() -> barraProgresso.setValue(barraProgresso.getValue() + 1))).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (count % batchSize == 0) {
            statement.executeBatch();
            conecta_contaContab.conecta();
            conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
            mostrar_tabela();
       }
    }   
  // execute the remaining queries
    statement.executeBatch();
    conecta_contaContab.conexao.close();
    JOptionPane.showMessageDialog(null, "Importação realizada com sucesso", "", JOptionPane.INFORMATION_MESSAGE);
    conecta_contaContab = new ConexaoBD();
    conecta_contaContab.conecta();
    conecta_contaContab.executeSQL("Select * from con_pcc01 order by idPlanCont");
    mostrar_tabela();
    conecta_contaContab.desconecta();

} catch (IOException ex) {
    JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
} catch (SQLException ex) {
    JOptionPane.showMessageDialog(null, "Erro ao importar: " + ex, "", JOptionPane.ERROR_MESSAGE);
    try {
        conecta_contaContab.conexao.rollback();
    } catch (SQLException e) {
        JOptionPane.showMessageDialog(null, "Erro ao importar: " + e, "", JOptionPane.ERROR_MESSAGE);
    }
}
conecta_contaContab.conecta();

}
});
worker.start();
}else{
}

1 curtida