Giriş
Şu satırı dahil ederiz. Java 6 ile geliyor.
Kalıtım
Şöyle yaparız. İlk generic parametre doInBackground metodunun döndürdüğü tiptir. İkinci generic parametre publish() ve process() metodlarının aldığı parametre tipidir.
cancel metodu
Şöyle yaparız
Şöyle yaparız.
Worker thread tarafından çalıştırılır. Bu metod içinde UI güncellenemez. UI'ya bilgi göndermek için iki seçenek var.
1. publish() çağrısı ile process() metodu tetiklenir
2. setProgress() çağrısı ile bu nesneye addPropertyChangeListener() çağrısı ile abone olan sınıf tetiklenir.
Örnek
Şöyle yaparız.
Bu metod içinde UI güncellenir. Şöyle yaparız.
process metodu
Bu metod içinde UI güncellenir. Metod parametresi List<T> şeklinde. Yani biz publish() metodunu tek bir parametre ile çağırsak bile buraya List<T> olarak geliyor.
Şu satırı dahil ederiz. Java 6 ile geliyor.
import javax.swing.SwingWorker;
ExecutorService
SwingWorker Runnable arayüzünden kalıtır ve global bir ExecutorService tarafından çalıştırılır. Bu ExecutorService içindeki thread'lerin isimleri "SwingWorker-" şeklindedir.
Şöyle yaparız. İlk generic parametre doInBackground metodunun döndürdüğü tiptir. İkinci generic parametre publish() ve process() metodlarının aldığı parametre tipidir.
public class MyWorker extends SwingWorker<String, Object> {
...
}
Kullanım
İki tane temel kullanım var
1. doInBackground() ile sonuç dönmek ve bunu done() metodu içinde kullanmak
2. doInBackground() içinde biten işleri kısım kısım publish() metodu ile göndermek ve bunları process() metodu içinde kullanmak
Örnek - doInBackground + done
Şöyle yaparız
class AnswerWorker extends SwingWorker<Integer, Integer> {
@Override
protected Integer doInBackground() throws Exception {
// Do a time-consuming task.
Thread.sleep(1000);
return 42;
}
@Override
protected void done() {
JOptionPane.showMessageDialog(f, get());
}
}
Şöyle yaparız
swingWorker.cancel(true);
execute metoduŞöyle yaparız.
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
...
return null;
}
};
worker.execute();
doInBackground metoduWorker thread tarafından çalıştırılır. Bu metod içinde UI güncellenemez. UI'ya bilgi göndermek için iki seçenek var.
1. publish() çağrısı ile process() metodu tetiklenir
2. setProgress() çağrısı ile bu nesneye addPropertyChangeListener() çağrısı ile abone olan sınıf tetiklenir.
Örnek
Şöyle yaparız.
@Override
public String doInBackground() throws Exception {
...
return "";
}
done metoduBu metod içinde UI güncellenir. Şöyle yaparız.
@Override
protected void done() {
...
}
isDone metodu
Normalde SwingWorker'ın bitmesini beklemek gerekmiyor. Ancak beklemek istersek şöyle yaparız
SwingWorker work = ...;work.execute();// Wait for it to finishwhile (!work.isDone()) {// Show Progresstry {int progress = work.getProgress();System.out.println("Progress %" + progress);Thread.sleep(500);} catch (Exception ex) {System.err.println(ex);}} // End of Loop: while (!work.isDone())
Bu metod içinde UI güncellenir. Metod parametresi List<T> şeklinde. Yani biz publish() metodunu tek bir parametre ile çağırsak bile buraya List<T> olarak geliyor.
Örnek
Şöyle yaparız.
class Worker extends SwingWorker<String, String>{
...
@Override
protected String doInBackground() throws Exception {
//This is what's called in the .execute method
long startTime = System.nanoTime();
...
//This sends the results to the .process method
publish(String.valueOf(System.nanoTime() - startTime));
return null;
}
@Override
protected void process(List<String> item) {
double nanos = Long.parseLong(item.get(item.size()-1));
//This updates the UI
label.setText("Processing Time: " + nanos + " nanos");
}
}
Hiç yorum yok:
Yorum Gönder