JProgressBar em sincronia com inserts JPA

1 resposta
java
Thomasbrazpinto

Olá, tenho uma aplicação java (utilizando IDE netBeans) e nela, quando eu crio uma entidade do tipo “processo” automaticamente, cria diversas entidades do tipo “cartão ponto”, 1 cartão para cada data, isso depende de campos do processo (data de inicio e data de fim) ou seja, existe 1 cartão ponto para cada dia entre data de inicio e data de fim, independente da diferença em dias entre as duas, mas terá uma máscara limitando para 5 anos, o meu problema é: quando eu insiro o processo, inicia um for que percorre as datas e vai adicionando cartões ponto, como há um delay na conexão entre o bd e a aplicação, demora um tempo para isso terminar, enquanto isso ocorre, o botão fica pressionado e dá a impressão que o sistema travou.

tive a ideia entao de inserir uma JProgressBar em uma espécie de JDialog, mas todos os exemplos que eu achei, a barra é dependente de uma thread e, eu precisava que fosse dependente apenas do “for”, alguém sabe uma maneira de fazer isso?

segue o código do botão que adiciona (está funcionando perfeitamente, é apenas para terem uma base):

btAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    StringTools stT = new StringTools();
                    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
                    Processo p = new Processo();
                    boolean b = false;
                    for (Processo g : cPro.getList()) {
                        if (g.getNprocesso().equals(tfNumeroProcess.getText())) {
                            b = true;
                        }
                    }
                    if (b) {
                        JOptionPane.showMessageDialog(null, "Já existe um processo com esse número!");
                    } else {
                        for (Reclamado r : lRecl) {
                            if (r.getNomeReclamado().trim().equals((String) cbRecl.getSelectedItem())) {
                                p.setReclamadoIdReclamado(r);
                            }
                        }
                        for (Coloutroindices c : lCol) {
                            if (c.getNomeColoutroindices().trim().equals((String) cbTabela.getSelectedItem())) {
                                p.setColoutroindicesIdColoutroindices(c);
                            }
                        }
                        p.setIdProcesso(cPro.getNextId());
                        p.setNprocesso(tfNumeroProcess.getText());
                        p.setAdmissaoProcesso(sdf.parse(tfDatAdmiss.getText()));
                        p.setAjuizamentoProcesso(sdf.parse(tfDatAjuiz.getText()));
                        p.setCalculoProcesso(sdf.parse(tfDatCalc.getText()));
                        p.setCorrecaoProcesso(String.valueOf(cPro.setCor(rbCorrThis.isSelected(), rbCorrThat.isSelected())));
                        p.setDemissaoProcesso(sdf.parse(tfDatDemiss.getText()));
                        p.setDepvinculadaProcesso(cPro.setDep(chbFgtsDep.isSelected()));
                        p.setFgtsProcesso(tfFgts.getText());
                        p.setInssProcesso(String.valueOf(cPro.setInss(rbInssMes.isSelected(), rbInssTot.isSelected(), rbInssNoCalc.isSelected())));
                        p.setIrrfProcesso(String.valueOf(cPro.setIrrf(rbIrrfMes.isSelected(), rbIrrfTot.isSelected(), rbIrrfIn.isSelected(), rbIrrfNoCalc.isSelected())));
                        p.setJurosProcesso(String.valueOf(cPro.setJuros(rbJurosDia.isSelected(), rbJurosMes.isSelected())));
                        p.setLiberacaoProcesso(sdf.parse(tfDatLib.getText()));
                        String par = "";
                        for (int i : cPro.setParametros(chbParamRef.isSelected(), chbParamCalc.isSelected(), chbParamDsr.isSelected())) {
                            par += String.valueOf(i) + ",";
                        }
                        p.setParametrosProcesso(par);
                        p.setPrazoProcesso(sdf.parse(tfDatPraz.getText()));
                        p.setPrescricaoProcesso(sdf.parse(tfDatPresc.getText()));
                        p.setReclamanteProcesso(tfReclamante.getText());
                        p.setStatusProcesso(String.valueOf(cPro.setSta(rbStaAfz.isSelected(), rbStaEm.isSelected(), rbStaConc.isSelected(), rbStaEntr.isSelected())));
                        if (cPro.addPro(p)) {
                            try {
                                Calendar dateAdm = Calendar.getInstance();
                                dateAdm.setTime(sdf.parse(tfDatAdmiss.getText()));
                                Calendar dateDem = Calendar.getInstance();
                                dateDem.setTime(sdf.parse(tfDatDemiss.getText()));
//                                int dias = dateDem.get(Calendar.DAY_OF_YEAR) - dateAdm.get(Calendar.DAY_OF_YEAR);
                                int dias=stT.dataDiff(sdf.parse(tfDatAdmiss.getText()),sdf.parse(tfDatDemiss.getText()));
                                System.out.println(dias);
                                for (int i = 0; i < dias; i++) {
                                    Cartaoponto card = new Cartaoponto();
                                    card.setIdCartaoponto(cCard.getNextId());
                                    card.setDataCartaoponto(sdf.parse(cCard.somaData(tfDatAdmiss.getText(),i)));
                                    card.setEntradasCartaoponto("  :  =  :  =  :  =  :  =  :  ");
                                    card.setSaidasCartaoponto("  :  =  :  =  :  =  :  =  :  ");
                                    card.setFolgaCartaoponto(cCard.isFer(p.getReclamadoIdReclamado().getCidadeReclamado(),tfDatAdmiss.getText(),i));
                                    card.setNcolCartaoponto("5");
                                    card.setProcessoIdProcesso(p);
                                    card.setTotalCartaoponto("  :  ");
                                    cCard.insert(card);//aqui estou inserindo o cartão ponto;
//dentro desse for eu queria colocar o JProgressBar
                                }
                            } catch (Exception E) {
                                JOptionPane.showMessageDialog(null, "Ímpossível criar Cartão Ponto para esse Processo!");
                                E.printStackTrace();
                            }
                            JOptionPane.showMessageDialog(null, "Seu Processo e o respectivo Cartão Ponto foram cadastrados com sucesso!");
                        } else {
                            JOptionPane.showMessageDialog(null, "Não foi possível cadastrar o processo!");
                        }
                    }
                } catch (Exception E) {
                    E.printStackTrace();
                    JOptionPane.showMessageDialog(null, "Não foi possível inserir o processo!");
                }
            }
        });

1 Resposta

Thomasbrazpinto

consegui resolver o problema, para quem quiser, está aqui o jeito que usei para fazer o ProgressBar

JDialog jd = new JDialog();
                                jd.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
                                jd.setTitle("Inserindo registros");
                                jd.setSize(300, 100);
                                jd.setModal(true);
                                jd.setLocationRelativeTo(null);
                                JProgressBar pbar = new JProgressBar();
                                JLabel lbbar = new JLabel("");
                                pbar.setPreferredSize(new Dimension(275, 30));
                                pbar.setStringPainted(true);
                                pbar.setMaximum(x);
                                pbar.setMinimum(0);
                                pbar.setValue(0);
                                Container ca = jd.getContentPane();
                                ca.setLayout(new BorderLayout());
                                ca.add(pbar, BorderLayout.CENTER);
                                ca.add(lbbar, BorderLayout.SOUTH);

                                try {
                                    new Thread() {
                                        public void run() {
                                            for (int i = 0; i <= x; i++) {//x é o número de inserts que eu quero
                                                try {
                                                    sleep(5);
                                                    pbar.setValue(i);//atualizando conforme o for
                                                    lbbar.setText(String.valueOf(i) + "/" + String.valueOf(x));//mostrando para o usuário quantos registros ainda faltam fazer
                                                    Entidade e=new Entidade();
                                                    e.setAll("");//seta todos os atributos da entidade
                                                    daoEntidade.add(e);//insere no banco de dados
                                                } catch (Exception E) {
                                                    E.printStackTrace();
                                                }
                                            }
                                            jd.dispose();
                                        }
                                    }.start();
                                    jd.setVisible(true);
                                } catch (Exception E) {
                                    JOptionPane.showMessageDialog(null, "Ímpossível criar Cartão Ponto para esse processo!");
                                    E.printStackTrace();
                                }
Criado 22 de abril de 2016
Ultima resposta 9 de mai. de 2016
Respostas 1
Participantes 1