12 Şubat 2018 Pazartesi

Swing SwingWorker Sınıfı

Giriş
Ş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.

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.
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());
  }
}
cancel metodu
Şö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 metodu
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.
@Override
public String doInBackground() throws Exception {
  ...
  return "";
}
done metodu
Bu 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 finish
while (!work.isDone()) {
  // Show Progress
  try {
    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())
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.
Ö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