Ajuda com JProgressBar

11 respostas
S

Boa tarde!

Eu tenho um botão que busca no banco algumas informações para colocar em uma JTable…só que são muitas informações…
Então ele demora alguns segundos pra colocar ela na table…

Ai eu criei um JDilalog com uma progress bar q irá aparecer quando a pessoa clicar em buscar…e quando terminar de buscar esse dialog devera sumir…
Eu jah tenho o dialog funcionando com a progress bar(indeterminada)…

(segue o codigo do botao buscar)

btBuscar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Carregando c = new Carregando(); c.setVisible(true); btBuscar(false); c.dispose(); } });

Carregando eh o JDialog com a progress bar…
btBuscar eh o metodo q busca as informações no banco e o (false) eh um parametro do metodo…

com o codigo dessa maneira, quando o botao buscar for clicado ele abrirá o JDialog e só…ele nao busca as informações…
como eu faço pra deixar o JDialog aberto enquanto eu faço a busca?! e ai quando a busca terminar(ou seja, o metodo) ele fecha o jdialog?

Desde já agradeço!

11 Respostas

S

ninguem? :S

T

Debuga para ver, quando você dá o setVisible, a execução para neste ponto. O correto é ter uma Runnable q vai executar o método, e essa Runnable vai estar vinculada ao JProgressBar.

S

como funciona esse runnable?

T

Eu to no trampo, ta corrido… A idéia é essa.

public class TestRunnable extends JFrame{
   
         public static void main (String [] args){
            TestRunnable TestRunnable = new TestRunnable();
            TestRunnable.AtualizaTela atualizador = TestRunnable.new AtualizaTela();
            TestRunnable.GeraNumero gera = TestRunnable.new GeraNumero();
            Thread t1 = new Thread (atualizador);
            Thread t2 = new Thread (gera);
            
            t2.start();
            t1.start();
         }  

      
      class AtualizaTela implements Runnable{
         public void run (){
            while (bar.getValue () < 100000){
               bar.setValue (bar.getValue () + numero);
               System.out.println(bar.getValue());
               Thread.yield();
            }
            System.out.print ("fim atualiza");
         }
      }
      class GeraNumero implements Runnable {
         public void run (){
            while (bar.getValue () < 100000){
               numero = gerador.nextInt (2);
               Thread.yield();
            }
         }
      }

      public TestRunnable(){
         bar = new JProgressBar(0,100000);
         gerador = new Random();
         numero = 0;
         this.getContentPane().add (bar);
         this.pack();
         this.setVisible (true);
         this.setDefaultCloseOperation (this.EXIT_ON_CLOSE);
      }  

      
      JProgressBar bar;
      Random gerador;
      int numero;
   }

O que você não entender pode ir perguntando, mas se você não sabe nada sobre threads e Runnable é bom dar uma olhada aqui:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html

Att,

S

entao…mas a minha progress bar nao eh aqela de completar a barra e acaba…
eh aqela q fica batendo de um lado pro outro…

eu puiis essa propriedades nela:

bar.setIndeterminate(true);

ai eu preciso q ela simplismente apareça quando eu chamar…e q ela suma depois q um metodo terminar…

mas acontece q quando eu do um setVisible no jDialog ele soh mostra a tela e nao faz os proximos comandos…

ex:

eu tenho uma classe que o botao chama o outro Dialog:

btBuscar.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ new Carregando().setVisible(true); System.out.println("aqui"); } });

ai no exemplo quando acontece a ação do botão ele joga na tela o dialog normal…masss…o comando system.ou.println(“aqui”) não é executado…

acho q ele soh executa o proximo comando quando o dialog for fechado…:S

T

Sim, foi o que eu disse no primeiro post. Você pode inverter a ordem… setVisible depois…
Se não der a funcionalidade que você quer, terá que fazer como passei, eu fiz com ele montado até 100%, mais tarde eu faço um que fique indo pra la e pra cá

Edit : Abaixo de bar = new JProgressBar(0,100000);
coloque bar.setIndeterminate( true );

Que fará o que você quer. A idéia de Threads é justamente fazer mais de uma coisa ao mesmo tempo.

S

agora ele apareceu massss…rsrs

quando eu aperto o botao o frame aparece na hora…mas a barra soh começa a funcionar depois q o meu metodo termina!

:S

T

rsrs Por isso falei que o código vai ter que ser algo parecido com o que te passei. Faz assim, cria uma runnable dentro do seu codigo mesmo, dentro do metodo run coloca o seu método. Coloque uma nova thread com esta runnable .Ai voce tem que fazer uma verificação para parar a thread. Enquanto estiver executando seu metodo, vai estar indo para la e para ca…
Segue código mais simples que ilustra isso.

public class TestRunnable extends JFrame{

   private JProgressBar bar;

   public static void main (String [] args){
      TestRunnable TestRunnable = new TestRunnable();
      TestRunnable.AtualizaTela atualizador = TestRunnable.new AtualizaTela();
      Thread t1 = new Thread (atualizador);
      t1.start();
      
   }  


   private class AtualizaTela implements Runnable{
      public void run (){
         while (bar.getValue () < 100){
            bar.setValue (bar.getValue () + 1);
            meuMetodo();
           
         }
         System.out.print ("fim atualiza");
      }
   }
   
   private void meuMetodo(){
      int i = 0;
      while ( i < 100 ){
         i++;
         System.out.println("executando metodo" + i);
         if ( i == 99 ){
            this.dispose();
         }
      }
   }

   public TestRunnable(){
      bar = new JProgressBar(0,100);
      bar.setIndeterminate( true );
      this.getContentPane().add (bar);
      this.pack();
      this.setVisible (true);
      this.setDefaultCloseOperation (this.EXIT_ON_CLOSE);
   }

Note q dá um dispose no frame quando acaba…

S

eu consegui fazer de outro jeito...

eu criei minha classe principal onde esta a barra...
e depois q eu crio ela eu chamo outra classe q eh uma thread...
a thread executa o metodo pra min...
dessa vez abre certo o dialog...mas eu nao consigo fechar ele...

eu dou um dispose(); mas nao acontece nada!!! rsrs...
o q tem de errado no meu codigo?

segue abaixo as duas classes:

JDialog:
package gui;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

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

import metodos.ThreadLoad;

@SuppressWarnings("serial")
public class Carregando extends JDialog{
	private JPanel pnJanela;
	private JLabel lbCarregando;
	private JProgressBar barra;
	
	public Carregando(){
		try{
			setSize(300,100);
			setModal(true);
			setUndecorated(true);
			setDefaultCloseOperation(DISPOSE_ON_CLOSE);
			setLocationRelativeTo(null);
			{
				pnJanela = new JPanel();
				pnJanela.setBorder(BorderFactory.createLineBorder(Color.black));
	
				GridBagLayout layout = new GridBagLayout();
				
				layout.columnWidths = new int[]{5,290,5};
				layout.columnWeights = new double[]{0.0,0.0,0.0};
	
				layout.rowHeights = new int[]{5,15,20,5};
				layout.rowWeights = new double[]{0.0,0.1,0.0,0.0};
	
				pnJanela.setLayout(layout);
				
				add(pnJanela);	
				{
					{
						lbCarregando = new JLabel("Carregando...");
						pnJanela.add(lbCarregando, new GridBagConstraints(1,1,1,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0,0,0,0),0,0));
					}		
					{
						barra = new JProgressBar();
						barra.setIndeterminate(true);
						pnJanela.add(barra, new GridBagConstraints(1,2,1,1,0.0,0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
					}
				}
			}
			new ThreadLoad().iniciaLoad();
		}
		catch(Exception e){
			new StackTrace(e, "", "Metodo principal do Dialog Carregando");
		}
	}
}
Thread:
package metodos;

import gui.PainelConsultarEditarPendenciaRoot;
import gui.StackTrace;

public class ThreadLoad implements Runnable{
	public void iniciaLoad(){
		Thread thread = new Thread(this);
		thread.start();
	}
	public void run(){
		try{
			PainelConsultarEditarPendenciaRoot.btBuscar(false);
		}
		catch(Exception ex){
			new StackTrace(ex, "", "ThreadLoad").setVisible(true);
		}
	}
}
T

cria um construtor para o runnable, que recebe um Jdialog como parametro… ai voce da dispose pelo parametro

A

A solução é implementar a Runnable mesmo. É isso aê, Thread na veia!!!

Criado 18 de junho de 2010
Ultima resposta 19 de jun. de 2010
Respostas 11
Participantes 3