oi pessoal!
tenho um programa d manipulação de textos, e preciso montar uma GUI pra ele… to usando o netbeans, tudo bem, só que o meu chefe falou pra eu usar swingworker, já que o programa vai manipular textos muito grandes e possivelmente será lento.
eu nunca tinha ouvido falar em swingworker, aí fui a caça na internet… já procurei em vários sites, li alguns tutoriais, entendi pra que ele funciona, mas não faço ideia de como implementar…
alguém pode ser mais especifico e me ajudar? ou talvez fornecer um tutorial “entendível”?
enquanto eu não sei como implementar, posso ir montando a GUI e depois colocar o swingworker ou as duas coisas tem que ser feitas ao mesmo tempo?
thanks!!
abraço
Você já leu isso aqui:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html
Parece bem útil. 
eu tinha visto esse tutorial… li de novo, mas mesmo assim, é tudo muito teórico… a teoria eu pequei, preciso entender como introduzir isso no meu projeto…
eu sempre fui de aprender com exemplos, mas não consigo achar um exemplo geral, pra realmente ver a swingworker funcionando, com main, GUI, eventos e etc…
=/
Bom, fiz um pequeno exemplo, que apesar de totalmente inútil, demonstra um pouco de como as coisas funcionam. Como eu não comentei muito o código, talvez surjam dúvidas. Mas o fórum está aqui para isso.
:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;
public class WorkerDemo extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private JButton start;
private JTextArea area;
private JProgressBar bar;
public WorkerDemo() {
super("Worker Demo");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
start = new JButton("Inicia");
start.addActionListener(this);
area = new JTextArea(30, 30);
area.setEditable(false);
bar = new JProgressBar(0, 100);
add(start, BorderLayout.NORTH);
add(area, BorderLayout.CENTER);
add(bar, BorderLayout.SOUTH);
setSize(200, 400);
setLocationRelativeTo(null);
setVisible(true);
}
private class MyTask extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i <= 100; i++) {
// no seu caso, você faria algo útil aqui
new Container();
new JFrame();
System.gc();
// a Thread dorme um pouco
try {
Thread.sleep(20);
} catch (InterruptedException ex) {
}
// ajusta a barra de progresso
setProgress(i);
bar.setValue(getProgress());
}
return null;
}
@Override
protected void done() {
// quando completar, faz o que deve aqui
area.append("Tarefa completa!\n");
start.setEnabled(true);
bar.setValue(0);
}
}
@Override
public void actionPerformed(ActionEvent e) {
// trata o evento de quando se clica no botão
area.append("Iniciando tarefa...\n");
start.setEnabled(false);
new MyTask().execute();
area.append("Tarefa iniciada.\n");
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WorkerDemo();
}
});
}
}
valeu ae!
tenho que admitir que pra mim não tá facil de entende tudo isso, mas já dei uma lida, peguei pra roda, vo perde um tempo aqui e ver se consigo pega a ideia!
mas valeu mesmo!