首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复SwingWorker

重复SwingWorker
EN

Stack Overflow用户
提问于 2014-10-28 02:05:03
回答 1查看 308关注 0票数 1

我想要构建一个JFrame,它能够在每次JButton是clicked.currently时运行后台任务,我使用的是swing工作人员,它不会允许任务执行不止一次。

如何通过单击SwingWorkerJButton启用重复任务。

代码语言:javascript
复制
public class ScanFileFrame extends JFrame{

    JButton btnTicking;
    JLabel label1;

    ScanFileFrame(){

        JFrame jframe = new JFrame();
        jframe.setLayout(new FlowLayout());
        btnTicking = new JButton("Start Scanning Files");
        label1 = new JLabel("No File Scanned");

        btnTicking.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                worker.execute();

            }   
        });

        jframe.add(btnTicking);
        jframe.add(label1);

        jframe.setVisible(true);
        jframe.setSize(300,300);
    }

    SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {

        @Override
        protected Boolean doInBackground() throws Exception {

           // Simulate scan file
           System.out.println("scanning files ....");
           Thread.sleep(2000);

           return true;

        }

        //update jframe jlabel when background task finish
        protected void done() {
            label1.setText("Files Scanned");
            System.out.println("complete");
        }
    };

    public static void main(String[] args){
        ScanFileFrame f = new ScanFileFrame();

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-28 02:41:39

目前,我使用的是swing工作人员,它将不允许任务执行不止一次。

这不是一个问题,因为您只需要构建一个新的SwingWorker并在您的JButton的ActionListener中运行它。据我所知,这个,它是目前编写的问题的解决方案。如果你需要一个更详细的答案,那么你会想在你的问题中提供更多的细节。

编辑您的状态:

但是我不知道当用户每次点击扫描按钮时,如何重新创建这个挥棒工人。

你如何“改造”任何物体?通过创建一个新实例,这里有一个新的MySwingWorker,然后对它调用execute。

例如,

代码语言:javascript
复制
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.concurrent.ExecutionException;

import javax.swing.*;

public class ScanFileFrame {
   private FileScanAction fileScanAction = new FileScanAction("Scan Files", KeyEvent.VK_S);
   private JButton btnTicking = new JButton(fileScanAction);
   private JLabel label1;
   private MyFileScanWorker worker;

   ScanFileFrame() {

      JFrame jframe = new JFrame();
      jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      jframe.setLayout(new FlowLayout());
      label1 = new JLabel("       No File Scanned       ", SwingConstants.CENTER);

      jframe.add(btnTicking);
      jframe.add(label1);
      jframe.pack();
      jframe.setLocationByPlatform(true);
      jframe.setVisible(true);

   }

   @SuppressWarnings("serial")
   private class FileScanAction extends AbstractAction {
      public FileScanAction(String name, int mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         label1.setText("Scanning Files");
         fileScanAction.setEnabled(false);
         worker = new MyFileScanWorker();
         worker.addPropertyChangeListener(new WorkerListener());
         worker.execute();
      }
   }

   private class WorkerListener implements PropertyChangeListener {
      @Override
      public void propertyChange(PropertyChangeEvent pcEvt) {
         if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
            fileScanAction.setEnabled(true);
            try {
               boolean success = worker.get();
               String text = success ? "Scanning Successful" : "Scanning Error";
               label1.setText(text);
            } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
            }
         }
      }
   }

   private class MyFileScanWorker extends SwingWorker<Boolean, Void> {

      @Override
      protected Boolean doInBackground() throws Exception {
         // Simulate scan file
         Thread.sleep(2000);

         // have it work successfully 2/3 of the time.
         if (Math.random() > 0.3333) {
            return true;
         } else {
            return false;
         }
      }
   };

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            new ScanFileFrame();
         }
      });
   }
}

注意,您总是希望在get()完成后在SwingWorker上调用它,即使它返回null,这样就可以捕获在SwingWorker运行期间可能发生的任何异常。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26599794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档