[Resolvido]Barra de progresso, como proceder?

10 respostas Resolvido
java
L
class ChecarComSwingWorker implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {

                final int totalRows = CadoemTabela.getModel().getRowCount();
                progressBar.setMaximum(totalRows);
                progressBar.setMinimum(0);
                //passei parametros para facilitar o entendimento
                //- o primeiro é o retorno do doInBackground(não foi necessario uso neste exemplo)
                //- o segundo é o tipo do valor usado entre o publish e o process
                SwingWorker<Object, Integer> worker = new SwingWorker<Object, Integer>() {

                    //este método é que executa em uma Thread paralela
                    //todo processamento pesado que deve ser executado
                    //fora da EDT, deve ser executado aqui 
                    @Override
                    protected Object doInBackground() {
                        for (int i = 0; i < totalRows; i++) {
                            try {
                                Boolean status = (Boolean) CadoemTabela.getModel().getValueAt(i, 3);
                                status = status == null ? true : !status;
                                CadoemTabela.getModel().setValueAt(status, i, 3);
                                //este método é que atualiza a barra de progresso
                                //passando cada iteração para o método process
                                publish(i);
                                Thread.sleep(200);
                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }
                        }
                        return null;
                    }

                    //este método é que recebe o que é passado no publish
                    //e atualiza a barra de progresso na EDT
                    @Override
                    protected void process(List<Integer> chunks) {
                        int valueRecent = chunks.get(chunks.size() - 1);
                        progressBar.setValue(valueRecent + 1);
                    }

                    //só é executado quando o doInBackground termina
                    //o processamento
                    @Override
                    protected void done() {
                        progressBar.setValue(0);
                    }
                };

                worker.execute();
            }
        }

     `

jButton2.addActionListener(new ChecarComSwingWorker());

`
Pessoal, estou usando essa barra de progresso que ao apertar o botão, ele vai marcando uma coluna definida como checkbox na jtable, e ao mesmo tempo preenchendo a barra de progresso.Tudo funciona normal, mas o problema é que eu gostaria de chamar esse evento no meu jbutton da GUI ao clicar e também fazer com q ele respeite a permissão de se deseja salvar ou não. Ao tentar fazer deu certo, mas ele não aguarda finalizar o processo de preencher os checkbox e logo ja finaliza o processo. Segue meu botão:

private void cadOEMSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                             
    if (CadoemOEM.getText().isEmpty()) {
        JOptionPane.showMessageDialog(null, "O campo 'Oem' é obrigatório!", "", JOptionPane.WARNING_MESSAGE);
        CadoemOEM.requestFocus();
    } else {
        int p = JOptionPane.showConfirmDialog(null, "Você deseja realmente salvar?", "Salvar", JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE, new ImageIcon(this.getClass().getResource("/images/save.png")));
        if (p == 0) {
            cadOEMSalvar.addActionListener(new ChecarComSwingWorker());
            try {
                Class.forName(Auxiliar.AcessoBanco.getDriver());
                Connection con = DriverManager.getConnection(Auxiliar.AcessoBanco.getUrl(), Auxiliar.AcessoBanco.getUser(), Auxiliar.AcessoBanco.getPass());
                String sql = "insert into Cad_Oem"
                        + "(OEM)"
                        + "values(?)";
                PreparedStatement pst = con.prepareStatement(sql);
                pst.setString(1, CadoemOEM.getText());

                pst.executeUpdate();
                JOptionPane.showMessageDialog(null, "Salvo com sucesso!");

                painel tela = new painel();
                PreencherTabela();
                CadoemOEM.setText(null);

            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "Essa OEM já foi cadastrada!");

            }

        }
    }
}

10 Respostas

D

O método cadOEMSalvarActionPerformed está sendo chamado pelo botão da GUI?

Se for, acho que bastaria trocar a seguinte linha:

// cadOEMSalvar.addActionListener(new ChecarComSwingWorker());
new ChecarComSwingWorker().actionPerformed(evt);
L

Isso diego, o problema é q eu chamo o evento, mas já ele já da a mensagem de salvo com sucesso e apertando ok, ele nem termina e já fecha. Gostaria de saber se tem uma maneira de bloquear essa mensagem até q finalize a seleção para depois aparecer a mensagem de “Salvo com sucesso!”

D

Se eu entendi bem:

na classe ChecarComSwingWorker adicione no done:

progressBar.setValue(0);
tela.concluiuSwingWorker();

remova essas linhas, supondo que são essas linhas que deverão ser executadas quando terminer o processo

//                JOptionPane.showMessageDialog(null, "Salvo com sucesso!");
//
//                painel tela = new painel();
//                PreencherTabela();
//                CadoemOEM.setText(null);

e adicione lá um método que indica a conclusão:

pst.executeUpdate();
concluiuPercistencia();

crie esses métodos na classe onde está o cadOEMSalvarActionPerformed

boolean concluiuSwingWorker;
public void concluiuSwingWorker() {
	concluiuSwingWorker = true;
	concluiuThreads();
}
boolean concluiuPersistencia;
public concluiuPersistencia() {
	concluiuPercistencia = true;
	concluiuThreads();
}
public synchronized void concluiuThreads() {
	if (concluiuSwingWorker && concluiuPercistencia) {// quando ambos terminarem
	   JOptionPane.showMessageDialog(null, "Salvo com sucesso!");

	   painel tela = new painel();
	   PreencherTabela();
	   CadoemOEM.setText(null);
	} 
}

no ChecarComSwingWorker adicione o método

JFrame?? tela;
public void executar(JFrame?? tela) { // não sei o tipo exato
	this.tela = tela;
	actionPerformed(null);
}

e para chamar

new ChecarComSwingWorker().executar(this);

Adicione também FALSE nos atributos no inicio do método cadOEMSalvarActionPerformed
Tente entender antes de fazer as mudanças. Também não sei ao certo se vai funcionar.

Uma forma alternativa muito mais simples, crie um JDialog com modal true e com a mensagem “Aguarde”, coloque o esseDialog.setVisible(true) onde vc quer que pare e no done do SwingWorker adicione esseDialog.dispose() ou esseDialog.setVisible(false).

L

Bom dia Diego12, blz cara? Foi mal não responder, estava viajando. Vou tentar fazer como vc disse e mais tarde respondo como ficou. Vlw pela resposta ai brother!

L

Diego, Não está dando certo. Poderia me informar como poderia ser usando o modal? Não entendi muito bem essa maneira mais fácil.

D

Funciona muito parecido com JFrame

JDialog dialog = new JDialog();
dialog.setModal(true);
dialog.getContentPane().add(new JLabel("Aguarde"));
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);

Se estiver usando a ferramenta de design do NetBeans, deve existir uma forma de criar um form do tipo Dialog, então seria interessante colocar a barra de progresso com a mensagem “aguarde” nesse dialog.

L

blz, vou tentar aqui

D
Solucao aceita

Um exemplo para testar:

public class SwingWorkerTest {

    JFrame frame;
    JDialog dialog;
    JLabel mensagem;
    JButton contar;

    public SwingWorkerTest() {
        frame = new JFrame();
        dialog = new JDialog();
        mensagem = new JLabel("Inicio");
        contar = new JButton("Contar 20 barras");

        dialog.setModal(true);
        dialog.getContentPane().add(new JLabel("Aguarde"));
        dialog.setLocationRelativeTo(null);
        dialog.pack();

        contar.addActionListener(e -> {
            // cria a Thread
            SwingWorker<Object, Object> swingWorker = new SwingWorker<Object, Object>() {
                @Override
                protected Object doInBackground() throws Exception {
                    System.out.println("Processando a barra");
                    while (mensagem.getText().length() < 20) {
                        mensagem.setText(mensagem.getText() + "||");
                        System.out.println("Adicionou duas barras");
                        Thread.sleep(1000);
                    }
                    return null;
                }

                @Override
                protected void done() {
                    // ao terminar, fechar dialog
                    dialog.setVisible(false);
                    System.out.println("Terminou o SwingWorker");
                }
            };
            // inicializa a barra
            mensagem.setText("");
            // simulando acesso ao banco
            System.out.println("Processando acesso ao banco");
            // inicia o worker
            System.out.println("Iniciando o SwingWorker");
            swingWorker.execute();
            // para essa thread
            dialog.setVisible(true);
            // ja terminou o swingworker
            
            mensagem.setText("Terminou!!!");
        });

        // configuracoes da view
        frame.getContentPane().setLayout(new GridLayout(2, 1));
        frame.getContentPane().add(mensagem);
        frame.getContentPane().add(contar);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new SwingWorkerTest();
    }
}
L

Oloco, que top! hehe… vlw

L

Parabéns cara, mandou muito bem. Obrigado pela ajuda!

Criado 29 de março de 2018
Ultima resposta 2 de abr. de 2018
Respostas 10
Participantes 2