Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความสำคัญของคลาส SwingWorker ใน Java

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();
    }
}

ผลลัพธ์

ความสำคัญของคลาส SwingWorker ใน Java

ความสำคัญของคลาส SwingWorker ใน Java