A SwingWorker คลาสช่วยให้เราสามารถดำเนินการ อะซิงโครนัส งาน ในเธรดผู้ปฏิบัติงาน (เช่น งานที่ใช้เวลานาน) จากนั้นอัปเดตส่วนประกอบ Swing จาก Event Dispatch Thread (EDT ) ตามผลงาน เปิดตัวใน Java 1.6 Version
คลาส SwingWorker
- java.swing.SwingWorker class เป็นผู้ปฏิบัติงานซึ่งทำงานที่ต้องใช้เวลานานในเบื้องหลัง
- A SwingWorker อินสแตนซ์โต้ตอบกับ 3 เธรด ปัจจุบัน กระทู้ , เธรดผู้ปฏิบัติงาน และ Event Dispatch thread(EDT)
- กระแส ปัจจุบัน กระทู้ เรียก execute() วิธีการเริ่มงานไปที่พื้นหลังและกลับมาทันที
- The คนงาน กระทู้ รัน doInBackground() . เวอร์ชันของเราเอง วิธีการอย่างต่อเนื่องในพื้นหลัง
- The เธรดการส่งกิจกรรม (EDT) ตื่นขึ้นมาเป็นครั้งคราวเพื่อแจ้งให้เราทราบว่าเกิดอะไรขึ้นใน คนงาน กระทู้ .
- เมื่อ doInBackground() สิ้นสุดลง เธรดการส่งกิจกรรม (EDT) แจ้งให้เราทราบโดยเรียกเวอร์ชันของเราว่า done() วิธีการ
- ในการเผยแพร่ค่ากลาง เราสามารถเรียก publish(V) เมธอดใน doInBackground() . เธรดการส่งกิจกรรม (EDT) แจ้งให้เราทราบโดยเรียกเวอร์ชันของ กระบวนการ (รายการ) วิธีการ
- ในการอัปเดตคุณสมบัติความคืบหน้า เราสามารถเรียก setProgress(i) เมธอดใน doInBackground() เธรดการส่งกิจกรรม (EDT) แจ้งให้เราทราบโดยเรียกเวอร์ชันของเราว่า PropertyChangeListener คลาส.
- แถบ java.swing.JProgressbar class เป็นองค์ประกอบ UI ที่ออกแบบมาเพื่อแสดงความคืบหน้าของงานพื้นหลังที่ใช้งานเป็น 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(); } }
ผลลัพธ์