[RESOLVIDO] JProgressBar não sai do lugar

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

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

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.

[quote=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. [/quote]

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

Valeu mesmo!