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 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.