Lớp SwingWorker cho phép thực hiện tác vụ bất đồng bộ trong worker thread (như tác vụ chạy lâu) sau đó cập nhật component Swing từ Event Dispatch Thread (EDT) dựa trên kết quả. Được giới thiệu từ Java 1.6.
SwingWorker class
- javax.swing.SwingWorker là task worker thực hiện tác vụ tốn thời gian ở background.
- Instance SwingWorker tương tác 3 thread: Current thread, Worker thread, Event Dispatch Thread (EDT).
- Current thread gọi execute() khởi động task background và trả về ngay.
- Worker thread thực thi doInBackground() liên tục ở background.
- EDT đánh thức định kỳ thông báo tiến trình Worker thread.
- Khi doInBackground() kết thúc, EDT gọi done().
- Để publish giá trị trung gian, gọi publish(V) trong doInBackground(). EDT thông báo bằng process(List).
- Để cập nhật progress property, gọi setProgress(i) trong doInBackground(). EDT thông báo qua PropertyChangeListener.
- JProgressBar là UI component hiển thị tiến trình background task implement bằng SwingWorker.
Ví dụ
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();
}
}
Kết quả

