Java中SwingWorker類的重要性是什麼?
SwingWorker 類使我們能夠在工作執行緒中執行非同步任務(例如長時間執行的任務),然後根據任務結果從事件分發執行緒 (EDT) 更新 Swing 元件。它是在Java 1.6 版本中引入的。
SwingWorker 類
- java.swing.SwingWorker 類是一個任務工作器,它在後臺執行耗時的任務。
- 一個SwingWorker 例項與 3 個執行緒互動:當前執行緒、工作執行緒和事件分發執行緒 (EDT)。
- 當前執行緒呼叫execute() 方法將任務啟動到後臺並立即返回。
- 工作執行緒在後臺持續執行我們自己的doInBackground() 方法版本。
- 事件分發執行緒 (EDT) 不時醒來,通知我們工作執行緒中發生了什麼。
- 當doInBackground() 結束時,事件分發執行緒 (EDT) 透過呼叫我們自己的done() 方法版本來通知我們。
- 要釋出中間值,我們可以在doInBackground() 中呼叫publish(V) 方法。事件分發執行緒 (EDT) 透過呼叫我們自己的process(List) 方法來通知我們。
- 要更新進度屬性,我們可以在doInBackground() 中呼叫setProgress(i) 方法。事件分發執行緒 (EDT) 透過呼叫我們自己的PropertyChangeListener 類版本來通知我們。
- java.swing.JProgressbar 類是一個 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(); } }
輸出
廣告