Usando SwingWorker para atualizar GUI

Eu tenho o seguinte problema…
uma tela, onde o usuário quando clica em executar… os botões são desabilitados,
e começa a encher uma barra de progresso…
só que quando o usuário clica em executar, a tela congela…
e, busquei no fórum, que a melhor forma é trabalhar com swingwork, só que…
eu vejo que eu terei necessidade de criar um para desabilitar /habilitar os botões…
e outro pra encher a barra de progresso, sem falar da 3ª thread, que executa o processo demorado…
O que me dizem?

No meu ponto de vista são só duas threads, uma que já está rodando e que ficaria a cargo de controlar a interface gráfica (botões e barra de progresso) e uma que seria iniciada ao clicar no botão, e que roda o processo demorado.

Minha duvida agora é a seguinte…

[code]public class Execucao extends SwingWorker<Object, String> {

@Override
protected Object doInBackground() {
    try {
        executa();
    } catch (Exception ex) {
        Logger.getLogger(Execucao.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}[/code]

quando na principal eu dou um

execucao.execute();

meu método de migrar é executado… porém, quando conclui e eu clico novamente em executar…
não acontece nada…

[quote=wilsontads]Minha duvida agora é a seguinte…

[code]public class Execucao extends SwingWorker<Object, String> {

@Override
protected Object doInBackground() {
    try {
        executa();
    } catch (Exception ex) {
        Logger.getLogger(Execucao.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}[/code]

quando na principal eu dou um

execucao.execute();

meu método de migrar é executado… porém, quando conclui e eu clico novamente em executar…
não acontece nada…[/quote]

SwingWorkers só podem ter seu método execute() chamado uma única vez. Se você deseja repetir a operação, precisa criar um novo objeto SwingWorker. Por exemplo, em vez de:

//algum lugar do seu código:
Execucao execucao = new Execucao();

//dentro do listener do botão "executar"
execucao.execute();

Voce deveria fazer o seguinte:


//dentro do listener do botão "executar"
Execucao execucao = new Execucao();
execucao.execute();

Entendeu?

Sim…, agora suponhamo-nos que esse meu método

executa();

recebe um parâmetro do tipo inteiro, como eu passaria utilizando swingwork?

[quote=wilsontads]Sim…, agora suponhamo-nos que esse meu método

executa();

recebe um parâmetro do tipo inteiro, como eu passaria utilizando swingwork?[/quote]

Você poderia recebê-lo no construtor do seu SwingWorker, ou através de um set mesmo, e usá-lo no método execute.

[code]

public class Execucao extends SwingWorker<Object, String> {

public int codigo = 1;
public Execucao(int codigo){
this.codigo = codigo;
}
@Override
protected Object doInBackground() {
try {
executa(codigo);
} catch (Exception ex) {
Logger.getLogger(Execucao.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

@Override
public void done() {
}

}[/code]

E no principal fazer algo do tipo

Execucao execucao = new Execucao(int codigo);
execucao.execute();

?

Correto.

Valeu man… =D

Na verdade, ainda surgiu um probleminha…
minha classe com swingwork, não está sendo executada no momento em que eu mando executar… =\

public void actionBtExecutar() { try { new ExecMigra(this,false).execute(); //Aqui acontece a interrupção JTable tabela = (JTable) tblTabelas.getModel();

Por algum motivo, meu SwingWorker, não consegue chegar até o

@Override protected Object doInBackground() throws Exception { PbBtLgnd(obj); return null; }
e é interrompido … =\

Porque você não usa:

[code]
java.awt.EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {

                                 ...
                           }

});[/code]

Esse ta sendo usando no meu JFrame…
só que no método btnExecutar,

            new ExecMigra(this,false).execute();            

ele vai pra minha classe ExecMigra, passa pelo construtor, e volta pro Jframe, antes de ir pro
doInBackground()
=(

[code]public ExecMigra(Lista lstbl,Boolean obj) throws Exception { //Passa aqui…
this.lstbls = lstbl;//Passa aqui…
this.obj = obj;//Passa aqui…
}//Passa aqui… e volta pra outra classe, antes de ir pro método abaixo…

@Override
protected Object doInBackground() throws Exception {
    PbBtLgnd(obj);
    return null;
}[/code]

Tentei run também…
aconteceu o mesmo =\

Alguém sabe me dizer?.. por que é interrompido, antes de ir pro doInBackground ?
=\