[RESOLVIDO] JProgressBar não sai do lugar

3 respostas
R

Pessoal, estou fazendo uma pequena (mas pequena mesmo) aplicação em Swing. A aplicação já está funcionando sem a Progress Bar. Então resolvi melhorar e colocar uma JProgressBar para dar um FeedBack ao usuário de uma tarefa que está rodando. Essa tarefa é uma Thread separada.

Eu tenho a minha classe visual Swing (gerei no NetBeans e editei algumas coisas no Eclipse). Omiti linhas de códigos desnecessários e que deixava a classe muito longa. Principalmente por causa do NetBeans:

import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Main extends javax.swing.JFrame {

    private static final long serialVersionUID = 1L;

    public Main() {
        initComponents();
    }


    private void initComponents() {
        ...
        progress = new javax.swing.JProgressBar();
        ...
    }


    private void btnFileSelectActionPerformed(ActionEvent evt) {
             ...
    }

    private void btnVerificarWorkspaceActionPerformed(ActionEvent evt) {
	     ...
    }

    private void btnOrganizarWorkspaceActionPerformed(ActionEvent evt) {
             ...
			if (!stop) {
				try {
					this.progress.setMinimum(0);
					this.progress.setMaximum(projetosSelecionados.size());
					this.progress.setStringPainted(true);
					this.progress.setVisible(true);

					Configuracao c = new Configuracao(projetosSelecionados);
					Thread t = new Thread(c);
					t.start();

					while (!c.isFinalizado()) {
						this.progress.setValue(c.getNumeroProjetosFinalizados());
					}

					JOptionPane.showMessageDialog(null,
							"Workspace configurada", "Informação",
							JOptionPane.INFORMATION_MESSAGE);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
    }


    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    ...
    private javax.swing.JProgressBar progress;
    ...
}

Ta tudo funcionando, só essa progress bar que não fica enchendo. Não sei se estou furando em alguma configuração dela. Realmente não sei. Abaixo vai o código que a Thread dispara!

import java.util.Iterator;
import java.util.List;
import java.util.Map;


public class Configuracao implements Runnable {

	private boolean finalizado;
	private List<Map<String, String>> projetos;
	private int projetosFinalizados;

	public Configuracao(List<Map<String, String>> projetos) {
		this.projetos = projetos;
		this.projetosFinalizados = 0;
	}

	@Override
	public void run() {
		this.finalizado = false;

		Iterator<Map<String, String>> i = this.projetos.iterator();

		while (i.hasNext()) {
			Map<String, String> projeto = (Map<String, String>) i.next();
			try {
				Workspace.setarConfiguracao((String) projeto.get("path"));
				this.projetosFinalizados++;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		this.finalizado = true;
	}

	public boolean isFinalizado() {
		return this.finalizado;
	}

	public int getNumeroProjetosFinalizados() {
		return this.projetosFinalizados;
	}
}

Alguém sabe porque essa progress bar nem da sinal de vida?

Valeu

3 Respostas

S

Olá amigo

aí vai um exemplo de splash com :JProgressBa, espero que lhe ajude.

package assistenciadesktop        ;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import assistenciadesktop.FramePrincipal_Old;
import javax.swing.UnsupportedLookAndFeelException;

public class Splash {

	private static TelaAberturaJWindow sp;
    private static String contar;

	public static void criarExibirInterface() throws InterruptedException, ClassNotFoundException {

        Thread.sleep(3000);
		String lookAndFeel = UIManager.getSystemLookAndFeelClassName();

		sp = new TelaAberturaJWindow("splash_guj.jpg");
		sp.showSplash();
                sp.setProgressMaxMin(0, 100);

                sp.setDisplayString(50, "Conectando ao banco de dados...");

                for (int contar = 0 ; contar < 20000; contar ++){
                   System.out.println("Valor"+contar);
                }
		sp.setDisplayString(100, "Carregando interface...");
        sp.hideSplash();
	}

    @SuppressWarnings("empty-statement")
	public static void main(String[] args) {

		String lookAndFeel = UIManager.getSystemLookAndFeelClassName();

		sp = new TelaAberturaJWindow("splash_guj.jpg");
		sp.showSplash();
                sp.setProgressMaxMin(0, 100);

                sp.setDisplayString(50, "Conectando ao banco de dados...");

                for (int contar = 0 ; contar < 20000; contar ++){
                   System.out.println("Valor"+contar);
                }
		sp.setDisplayString(100, "Carregando interface...");


		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
                try {
                    try {
                        criarExibirInterface();
                    } catch (ClassNotFoundException ex) {
                        Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } catch (InterruptedException ex) {
                    Logger.getLogger(Splash.class.getName()).log(Level.SEVERE, null, ex);
                }
			}
		});
	}

}

Silvio Guedes

ViniGodoy

Seu problema é o clássico, que está presente em absolutamente todos os tópicos de “JProgressBar não funciona” do GUJ.

Você está atualizando a JProgressBar na thread do Swing. O Swing precisa que você libere a thread dele para que ele processe o repaint, mas seu while segura o processamento dentro do tratamento do evento.

Para resolver, mova a linha:
progress.setValue(c.getNumeroProjetosFinalizados());

Para dentro da outra thread e elimine aquele while que tudo irá funcionar.
Se quiser dar a mensagem ao final, mova-a para dentro da thread também.

R

ViniGodoy:
Seu problema é o clássico, que está presente em absolutamente todos os tópicos de “JProgressBar não funciona” do GUJ.

Você está atualizando a JProgressBar na thread do Swing. O Swing precisa que você libere a thread dele para que ele processe o repaint, mas seu while segura o processamento dentro do tratamento do evento.

Para resolver, mova a linha:
progress.setValue(c.getNumeroProjetosFinalizados());

Para dentro da outra thread e elimine aquele while que tudo irá funcionar.
Se quiser dar a mensagem ao final, mova-a para dentro da thread também.

Caramba! Funcionou muito bem. Perfeito.
Com algumas linhas entendi muita coisa que estava em dúvida.

Valeu mesmo!

Criado 23 de março de 2009
Ultima resposta 24 de mar. de 2009
Respostas 3
Participantes 3