Progressbar "atrasada" [RESOLVIDO]

Gente, essa eu não entendi mesmo!!! :frowning:

Na classe listener da minha tela de menu do sistema, tenho o seguinte código (resumidamente) na chamada de um determinado relatório:

// isso é pra mostrar na tela principal um progressbar mexendo só pro usuário saber que está carregando o rel
((TelaPrincipal)Base.frameTela).lblInformacao.setVisible(true);
((TelaPrincipal)Base.frameTela).lblInformacao.setEnabled(true);
((TelaPrincipal)Base.frameTela).lblInformacao.setText("Carregando relatório...");
((TelaPrincipal)Base.frameTela).pgbStatus.setVisible(true);
((TelaPrincipal)Base.frameTela).pgbStatus.setEnabled(true);
((TelaPrincipal)Base.frameTela).pgbStatus.setIndeterminate(true);
((TelaPrincipal)Base.frameTela).pgbStatus.repaint();					
        	
// crio meu relatório
RelatoriosPersonalizados rp = new RelatoriosPersonalizados(false);

// apresento ele na tela
rp.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
rp.setVisible(true);
Dimension infScreen = rp.getSize();
int infHeight = infScreen.height;
int infWidth = infScreen.width;

rp.setLocation(telaPrincipal.desktopPane.getSize().width/2-infWidth/2,telaPrincipal.desktopPane.getSize().height/2-infHeight/2);

telaPrincipal.desktopPane.add(rp);
	    	
try {
        rp.setSelected(true);
} catch (Exception x) {
	x.printStackTrace();
}

Bom, o que eu esperava que acontecesse seria mostrar o progressbar rodando já de início e por fim, depois, abrir a tela.

No entanto, o que acontece é ficar sem fazer nada na tela e de repente abre a tela e inicia o progressbar juntos! :shock:

Alguém pode me dizer pq isso acontece? Já usei invokeLater e nada, Thread.sleep() e tb não deu! Alguma sugestão?!

Grata,

Me parece que a parte do progress bar e a geração do relatório deveriam estar em threads diferentes para você ter o resultado que espera. Pois logo depois que você seta as propriedades do progress bar, a aplicação fica “trancada” aguardando o retorno da geração do relatório.

Olá, Renata

O método invokeLater deveria funcionar, lembrando que apenas o trecho do codigo abaixo deve estar dentro dele:

((TelaPrincipal)Base.frameTela).lblInformacao.setVisible(true);
((TelaPrincipal)Base.frameTela).lblInformacao.setEnabled(true);
((TelaPrincipal)Base.frameTela).lblInformacao.setText(“Carregando relatório…”);
((TelaPrincipal)Base.frameTela).pgbStatus.setVisible(true);
((TelaPrincipal)Base.frameTela).pgbStatus.setEnabled(true);
((TelaPrincipal)Base.frameTela).pgbStatus.setIndeterminate(true);
((TelaPrincipal)Base.frameTela).pgbStatus.repaint();

abraços,

De uma olhada na classe SwingWorker também, pois é como um invokeLater() mas com algumas melhorias

se utiliza java 6: http://java.sun.com/javase/6/docs/api/javax/swing/SwingWorker.html

senao:
https://swingworker.dev.java.net/

abraços

Pessoal, tentei tudo que me sugeriram, nada deu certo. Ai, por fim tivemos uma idéia :idea: e funcionou. Veja como resolvi caso alguém precise disso futuramente:

Thread threadRelatoriosPersonalizados = new Thread(new ThreadRelatoriosPersonalizados());
threadRelatoriosPersonalizados.start();

E criei toda aquela chamada de código que eu fazia, numa classe Thread separada, assim:

public class ThreadRelatoriosPersonalizados implements Runnable {

    public ThreadRelatoriosPersonalizados(){}

    public void run() {

        // isso é pra mostrar na tela principal um progressbar mexendo só pro usuário saber que está carregando o rel
        ((TelaPrincipal)Base.frameTela).lblInformacao.setVisible(true);
        ((TelaPrincipal)Base.frameTela).lblInformacao.setEnabled(true);
        ((TelaPrincipal)Base.frameTela).lblInformacao.setText("Carregando relatório...");
        ((TelaPrincipal)Base.frameTela).pgbStatus.setVisible(true);
        ((TelaPrincipal)Base.frameTela).pgbStatus.setEnabled(true);
        ((TelaPrincipal)Base.frameTela).pgbStatus.setIndeterminate(true);
        ((TelaPrincipal)Base.frameTela).pgbStatus.repaint();					
         	
        // crio meu relatório
        RelatoriosPersonalizados rp = new RelatoriosPersonalizados(false);
 
        // apresento ele na tela
        rp.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
        rp.setVisible(true);
        Dimension infScreen = rp.getSize();
        int infHeight = infScreen.height;
        int infWidth = infScreen.width;

        rp.setLocation(telaPrincipal.desktopPane.getSize().width/2-infWidth/2,telaPrincipal.desktopPane.getSize().height/2-infHeight/2);
 
        telaPrincipal.desktopPane.add(rp);
 	    	
        try {
                rp.setSelected(true);
        } catch (Exception x) {
 	        x.printStackTrace();
        }
    }
}

Desta forma funciona! :?

Obrigada à todos!

Puxa, essa foi a minha sugestão, acho que não fui muito claro :cry:

Desculpa! Juro que entendi outra coisa… rs… :oops: :oops: :oops:

Mas valeu!

Semp problemas, eu devia ter colocado um trecho de código exemplificando… a didática não é meu ponto forte. :oops:
De qualquer maneira o importante é que está funcionando 8)