Como fazer uma barra de progresso em Java

Hoje vou mostrar como fazer uma barra de progresso simples em Java.

Alguns clientes as vezes pedem para fazer uma aplicação pequena em Java, e às vezes precisamos criar alguma barra de progresso.

Pensando nisso decidi montar esse tutorial. O primeiro passo ao criar a tela, é desenhar os componentes, sendo que nessa tela terei só a barra e um botão.

Tela inicial

A partir disso, ao colocar uma ação no botão, criamos uma tarefa, e essa tarefa irá atualizar as propriedades da barra.

Barra de progresso em andamento

Abaixo o código fonte desenvolvido para exemplificar:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.UIManager.*;

public class TestTi extends JFrame implements ActionListener, PropertyChangeListener {
	
	/* Declarando variaveis e componentes que serao usados na tela */
	private static final long serialVersionUID = 1L;
	private JButton btConfirmar;
	private JProgressBar progressBar;
	private Task task;
	
	public TestTi() {
		setLayout(null);
		
		/* Barra de Progresso colocando de 0 a 100 */
		progressBar = new JProgressBar(0, 100);
		progressBar.setStringPainted(true);
		progressBar.setBounds(10,10,470,30);
		progressBar.setString("...");
		add(progressBar);
		
		/* Botao Confirmar */
		btConfirmar = new JButton("Confirmar");
		btConfirmar.setBounds(190,50,120,30);
		btConfirmar.setToolTipText("Confirma a leitura");
		btConfirmar.setMnemonic('C');
		btConfirmar.addActionListener(this);
		add(btConfirmar);

		/* Definindo um estilo visual para aplicacao */
		try {
			for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
				if ("Nimbus".equals(info.getName())) {
					UIManager.setLookAndFeel(info.getClassName());
					SwingUtilities.updateComponentTreeUI(this);    
					this.pack();
					break;
				}
			}
		}
		catch (Exception e) {}
	}
  
	public void actionPerformed(ActionEvent e) {
		/* Se houver clique no botao confirmar, deixa o cursor do mouse carregando, e cria uma nova tarefa */
		if (e.getSource() == btConfirmar) {
			setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
	        task = new Task();
	        task.addPropertyChangeListener((PropertyChangeListener) this);
	        task.execute();
		}
		
	}
	
	public void propertyChange(PropertyChangeEvent evt) {
		/* Definindo o valor da barra de progresso na mudanca de propriedade */
		if ("progress" == evt.getPropertyName()) {
			int progress = (Integer) evt.getNewValue();
			progressBar.setValue(progress);
		} 
	}

	class Task extends SwingWorker<Void, Void> {
		@Override
		public Void doInBackground() throws InterruptedException {
			
			/* Define a barra como 0, e as variaveis de controle */
			setProgress(0);
			int atual = 0;
			int porcentagem = 0;
			int total = 100;
			
			/* Define a barra como o valor total */
			setProgress(total);
			
			/* Percorre do valor inicial ate o total, e altera tambem a mensagem mostrando a porcentagem */
			for (atual = 0; atual <= total; atual++) {
				porcentagem = (int) ((atual*100)/(total));
				setProgress(porcentagem);
				progressBar.setString(String.valueOf(porcentagem)+" %");
				//Thread.sleep(100);
			}
			
			return null;
		}
	
		@Override
		public void done() {
			/* Ao finalizar volta o cursor ao normal */
			Toolkit.getDefaultToolkit().beep();
			setCursor(null);
		}
	}

	public static void main(String arg[]) {
		/* Criando a janela principal */
		TestTi tstJanela = new TestTi();
		tstJanela.setSize(500,120);
		tstJanela.setLocationRelativeTo(null);
		tstJanela.setTitle("TestTi - Barra de Progresso");
		tstJanela.getContentPane().setBackground(Color.WHITE);
		tstJanela.setResizable(false);
		tstJanela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tstJanela.setVisible(true);
	}

	
}

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação