Swingworker: ajuda!

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. :slight_smile:

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. :wink: :

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!