SwingWorker ทำให้สามารถทำ Asynchronous Task ใน Worker Thread (เช่นงานที่รันนาน) แล้วอัปเดต Swing Components จาก Event Dispatch Thread (EDT) ตามผลลัพธ์ ถูกเพิ่มใน Java 1.6
SwingWorker Class
- javax.swing.SwingWorker เป็น Task Worker ทำงานหนักใน Background
- SwingWorker instance ทำงานกับ 3 Thread: Current Thread, Worker Thread, Event Dispatch Thread (EDT)
- Current Thread เรียก execute() เริ่มงาน Background คืนค่าทันที
- Worker Thread รัน doInBackground() ตลอดใน Background
- EDT ปรากฏขึ้นเรื่อยๆ แจ้งสถานะจาก Worker Thread
- เมื่อ doInBackground() จบ EDT เรียก done()
- ส่งค่าระหว่างทาง เรียก publish(V) ใน doInBackground() EDT เรียก process(List)
- อัปเดต Progress เรียก setProgress(i) ใน doInBackground() EDT เรียก PropertyChangeListener
- JProgressBar เป็น UI Component แสดงความคืบหน้าของ SwingWorker
ตัวอย่างโค้ด
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingWorkerTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new GUIWorker().execute();
}
});
button.setText("Click Me !!!");
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setSize(350, 300);
frame.setVisible(true);
}
});
}
}
class GUIWorker extends SwingWorker {
private JFrame frame = new JFrame();
private JDialog dialog = new JDialog(frame, "Swingworker Test", true);
private JProgressBar progressBar = new JProgressBar();
public GUIWorker() {
progressBar.setString("Waiting on time");
progressBar.setStringPainted(true);
progressBar.setIndeterminate(true);
dialog.getContentPane().add(progressBar);
dialog.setSize(350, 300);
dialog.setModal(false);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
@Override
protected Integer doInBackground() throws Exception {
System.out.println("GUIWorker doInBackground()");
Thread.sleep(10000);
return 0;
}
@Override
protected void done() {
System.out.println("done");
JLabel label = new JLabel("Task Complete");
dialog.getContentPane().remove(progressBar);
dialog.getContentPane().add(label);
dialog.getContentPane().validate();
}
}
ผลลัพธ์

