JProgressBar - A barra nao concilia com a tranferencia

6 respostas
nana_ps

Oii pessoal!!!
... já procurei nos fóruns aqui do GUJ mas não consegui achar uma solução para meu cógigo. Eu preciso de uma aplicação que ao clicar no botão que faz uma consulta do banco de dados, apareça uma barrinha de progresso para que o usuário tenha noção a que pe ta a pesquisa. Eu consegui colocar a barra progressiva, só que ela tá Indeterminada, fica pra lá e pra cá, não acompanha realmente a consulta do banco. Eu sei que precisa utilizar Theads, mas não consegui aplicar corretamente...

aqui ta o codigo com a ação do botão que deve ser acompanhado com a barra:
btListar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				final Progress p = new Progress();
				p.setVisible(true);
				SwingWorker worker = new SwingWorker() {
					@Override
					protected Object doInBackground() throws Exception {
						ListarTudo lt = new ListarTudo();//meu processo que irá demorar...
						return null;

					}

					@Override
					protected void done() {
						p.setVisible(false);
					}
				};
				worker.execute();
			}
		});
aqui tá a classe com o JProgressBar:
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JDialog;
import javax.swing.JProgressBar;

public class Progress extends JDialog {   
    public Progress() {   
        this.setTitle("Aguarde...");   
        setModal(false);   
        JProgressBar progress = new JProgressBar();   
        progress.setIndeterminate(true);   
        progress.setSize(200,20);   
        getContentPane().add(progress);   
        pack();   
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();   
        this.setLocation((tela.width - this.getSize().width) / 2,   
             (tela.height - this.getSize().height) / 2);   
    }   
}

Obrigada...

6 Respostas

ViniGodoy

Como você faz a atualização da ProgressBar?

Através de eventos?

nana_ps

Sim…

Esse exemplo que utiliza SwingWorker eu peguei aqui nos fóruns…

T

Se a consulta ao banco de dados é demorada, pode ocorrer uma de duas coisas:

  • Ou a consulta é realmente demorada (um table scan? Uma consulta sem índice) e os resultados demoram a aparecer. Nesse caso você não tem como saber quanto tempo vai demorar, e no máximo você pode fazer uma das seguintes coisas:
    a) Determinar o tempo máximo de uma consulta, e dizer que esse tempo é 100%. Use um timer ou outra coisa para atualizar o progresso, com base apenas no tempo. Se a consulta levar no máximo 100 segundos, a cada segundo você aumenta 1% no seu progress bar.
    b) Continuar usando uma barra de progresso indeterminado, já que não sabe quanto tempo vai levar. Pelo menos você está sendo honesto…
  • Ou então a consulta é rápida, mas são muitos dados para carregar. Se for assim, você tem de saber qual é o tamanho desses dados, e ir atualizando a barra de progresso à medida que você for carregando os dados (ou seja, percorrendo o resultset.).
_Zell_

Olá.
Aqui tem um exemplo de um StatusBar que eu fiz. Da uma olhada, você pode aproveitar a parte da barra de processo que eu fiz o/

package view.util;

import java.awt.BorderLayout;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

/**
 * <p>StatusBar é um componente para trabalhar com barra de status. Muito similar a barra de estatus
 * de navegadores de internet (browsers). É composto basicamente por um <b>String</b> status, que 
 * indica uma mensagem de processamento e uma barra de progressão (<b>JProgressBar</b>).</p>
 * 
 * <p>Seu principal método é o {@link #setStatus(String, int, boolean)}. Para mais informações veja 
 * a documentação do método.</p>
 * 
 * @author Filipe Luchini
 * */

@SuppressWarnings("serial")
public class StatusBar extends JPanel {
	
	private JProgressBar progressBar;
	private int progress, loader, delay;
	private JLabel statusText;
	private String defaulStatusText;
	
	
	/**
	 * Construtor padrão.
	 * */
	public StatusBar(){
		this.defaulStatusText = "Concluído!";
		this.initStatusBar(false);
	}
	
	
	/**
	 * Construtor no qual pode ser definido o texto de estado padrão da barra de status.
	 * @param defaultStatusText : texto de estado padrão.
	 * */
	public StatusBar(String defaultStatusText){
		this.defaulStatusText = defaultStatusText;
		this.initStatusBar(false);
	}
	
	
	/**
	 * Construtor no qual pode ser definido o texto de estado padrão da barra de status e se, quando
	 * carregar, vai ser contínua ou não.
	 * @param defaultStatusText : texto de estado padrão.
	 * @param indeterminate : deve ser passado <code>true</code> caso você queira que a barra de 
	 * progresso seja contínua.
	 * */
	public StatusBar(String defaultStatusText, boolean indeterminate){
		this.defaulStatusText = defaultStatusText;
		this.initStatusBar(indeterminate);
	}
		
	
	private void initStatusBar(boolean indeterminate){
		this.delay = 7;
		this.progress = 0;
		this.statusText = new JLabel(defaulStatusText);
		this.progressBar = new JProgressBar();
		if(indeterminate){
			this.progressBar.setIndeterminate(true);
		}	
		this.progressBar.setValue(progress);
		this.progressBar.setVisible(false);
		
		this.setLayout(new BorderLayout());
		this.add(statusText, BorderLayout.WEST);
		this.add(progressBar, BorderLayout.EAST);		
	}
	
	
	/**
	 * <p>Informa qual é o status atual do StatusBar</p>
	 * 
	 * @param status = texto que indica o status corrente de processo.
	 * @param load = valor em % (percentual de 0% a 100%) que equivale o processo.
	 * @param loading = caso seja true então será gerado a aminação de x% a y% da barra de progresso.
	 * Onde x% é o ultimo estado da barra de procresso e y% (<b>load</b>) é até onde a barra de progresso deve ser
	 * carregada. Caso seja informado 100% no argumento <b>load</b> então a barra de progresso será
	 * carregada até o fim e finalizada com o status padrão.   
	 * */
	public void setStatus(String status, int load, boolean loading){
		if(load < 0 || load > 100){
			Exception e = new Exception("O valor de procresso (load) deve estar entre 0% e 100%");
			e.printStackTrace();
		}else{
			
			if(load == 100){
				finalizeLoad();
			}else{
				statusText.setText(status);
				progressBar.setValue(progress);
				progressBar.setVisible(true);
				
				if(loading){			
					load(load);
				}else{
					progress = loader;
					progressBar.setValue(progress);
				}				
			}
		}		
	}
	
	
	private void load(int load){
		
		loader = load;
		
		Thread progressive = new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = progress; i < loader; i++) {
					
					progressBar.setValue(i);
					
					try {
						Thread.sleep(delay);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
				progress = loader;
				progressBar.setValue(progress);				
			}
		});
		progressive.start();
	}
	
	/**
	 * <p>Finaliza a prograssão de barra de progresso e posiciona o status de processo no status
	 * padão do {@link StatusBar}.</p>
	 * */
	public void finalizeLoad(){
		
		Thread progressive = new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = progress; i < 100; i++) {
					
					progressBar.setValue(i);
					
					try {
						Thread.sleep(delay);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
				progress = 0;
				progressBar.setValue(progress);
				progressBar.setVisible(false);
				statusText.setText(defaulStatusText);
			}
		});
			
		progressive.start();
	}

	
	public int getProgress() {
		return progress;
	}

	public void setProgress(int progress) {
		if(progress < 0 || progress > 100){
			Exception e = new Exception("O valor de procresso (load) deve estar entre 0% e 100%");
			e.printStackTrace();
		}else{
			this.progress = progress;
			if(progress == 100){
				finalizeLoad();
			}
		}
	}

	
	/**
	 * <p>
	 * Define o tempo de carregamento da barra de progresso.
	 * </p>
	 * @param delay : tempo de atraso (em ms).
	 * */
	public void setDelay(int ms){
		delay = ms;
	}
	
	
	public String getStatusText() {
		return statusText.getText();
	}

	public void setStatusText(String statusText) {
		this.statusText.setText(statusText);
	}

	public String getDefaulStatusText() {
		return defaulStatusText;
	}

	public void setDefaulStatusText(String defaulStatusText) {
		this.defaulStatusText = defaulStatusText;
		this.finalizeLoad();
	}
}
Vanilson

Olha, teria mais logica se usases o JProgressMonitor ao invês do JProgressBar, a implementação não é muita diferente q a do JProgressMonitor.

_Zell_

Uai, eu dei uma procurada nesse JProgressMonitor e não encontrei. Isso é de alguma API não nativa do Java 6 ?

Criado 13 de novembro de 2007
Ultima resposta 4 de ago. de 2010
Respostas 6
Participantes 5