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

輸出

更新於:2020年2月11日

634 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告