Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Tầm quan trọng của lớp SwingWorker trong Java

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ả

Tầm quan trọng của lớp SwingWorker trong Java

Tầm quan trọng của lớp SwingWorker trong Java