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?
Usando SwingWorker para atualizar GUI
15 Respostas
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..
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;
}
quando na principal eu dou um
execucao.execute();
Minha duvida agora é a seguinte..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; }quando na principal eu dou um
meu método de migrar é executado... porém, quando conclui e eu clico novamente em executar.. não acontece nada..execucao.execute();
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?
Sim…, agora suponhamo-nos que esse meu métodoexecuta();recebe um parâmetro do tipo inteiro, como eu passaria utilizando swingwork?
Você poderia recebê-lo no construtor do seu SwingWorker, ou através de um set mesmo, e usá-lo no método execute.
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() {
}
}
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:
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
...
}
});
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()
=(
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;
}
Tentei run também…
aconteceu o mesmo =\
Alguém sabe me dizer?.. por que é interrompido, antes de ir pro doInBackground ?
=\