精华内容
下载资源
问答
  • Swingworker

    2011-03-29 15:54:52
    swing swingworker wingworker wingworker
  • SwingWorker

    2020-05-12 09:14:52
    SwingWorker应用详解 https://www.cnblogs.com/mhzhou-whyj/p/7832840.html SwingWorker,done()在process()调用完成之前执行 http://www.voidcn.com/article/p-nagxubyv-bsz.html
    展开全文
  • swingworker排序

    2012-06-20 14:25:58
    作业:完善swingworker排序功能
  • Currently I have two SwingWorker threads doing job on background. If an exception occurs, the method stop to work, but the thread still runnig.How I do to stop the execution and kill the thread of the...

    Currently I have two SwingWorker threads doing job on background. If an exception occurs, the method stop to work, but the thread still runnig.

    How I do to stop the execution and kill the thread of the doInBackground() if an exception occurs?

    this.cancel(true) don't destroy/close the thread. How can I achieve this?

    @Override

    protected Boolean doInBackground() throws Exception {

    try {

    while (true) {

    //some code here

    return true;

    }

    } catch (Exception e) {

    this.cancel(true); //

    return false;

    }

    }

    I see these threads in the debug of Netbeans.

    'AWT-EventQueue-0' em execução

    'AWT-Windows' em execução

    'SwingWorker-pool-1-thread-1' em execução

    'SwingWorker-pool-1-thread-2' em execução

    //*em execução = in execution

    解决方案

    By default, SwingWorker reuses worker threads, so it is perfectly normal that, even though, doInBackground() has returned, to still see the thread that executed your method.

    You can identify this fact by looking at the thread names, as reported by NetBeans: SwingWorker-pool-1-thread-1, where that pool is managed by SwingWorker.

    If you want more control, you can also pass the SwingWorker instance to an Executor.

    Just check SwingWorker and Executor javadoc for further information.

    Besides, SwingWorker.cancel() is not supposed to be called from doInBackground() but rather from another thread, generally the EDT, e.g. when user clicks a Cancel button in a progress dialog.

    展开全文
  • SwingWorker线程杂记

    2020-01-14 18:08:30
    SwingWorker有两个参数即SwingWorker< T,V>,T是doInBackground和get方法的返回类型;V是publish和process方法要处理的数据类型 SwingWorker中的方法 方法:返回类型 作用或结果 #...

    SwingWoker线程杂记

    简介

    SwingWorker有两个参数即SwingWorker< T,V>,T是doInBackground和get方法的返回类型;V是publish和process方法要处理的数据类型

    SwingWorker中的方法

    方法:返回类型 作用或结果
    #doInBackground (): T 执行任务并返回T类型的结果
    +excute(): void 安排SwingWorker线程来执行工作线程
    +get(): T 等待SwingWorker完成后在主线程中调用该方法返回doInBackground()结果
    +isDone(): boolean 主线程调用,doInBackground()完成后返回ture,否则false
    +cancel(): boolean 按传入的参数决定是否取消任务
    #publish(V data): void 发送process方法要处理的数据。这个方法用于从doInBackground中传送之间结果,以处理process方法中的事件分发线程。注意,v…表示变种参数
    #process(): void 异步的接受事件分发线程来自publish方法传来的数据
    #setProgress(): void 设置进展属性,传入参数应为int类型0到100
    #getProgress(): void 返回进展约束属性

    SwingWorker简单应用

    import javax.swing.*;
    import java.awt.*;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.util.List;
    
    public Main{
    public static void main(String[] args) {
            SwingUtilities.invokeLater(
                    new Runnable() {
                        @Override
                        public void run() {
                            createGUI();
                        }
                    }
            );
        }
    public static void creatGUI() {
            JFrame jf = new JFrame("测试窗口");
            jf.setSize(300, 300);
            jf.setLocationRelativeTo(null);
            jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            
            JPanel panel = new JPanel(new BorderLayout());
            
            final JLabel label = new JLabel("正在下载: 0%");
            panel.add(label, BorderLayout.NORTH);
    
            final JTextArea textArea = new JTextArea();
            panel.add(textArea, BorderLayout.CENTER);
    
            jf.setContentPane(panel);
            jf.setVisible(true);
    
            // 创建后台任务
            SwingWorker<String, Integer> task = new SwingWorker<String, Integer>() {
                @Override
                protected String doInBackground() throws Exception {
                    for (int i = 0; i < 100; i += 10) {
                        // 延时模拟耗时操作
                        Thread.sleep(1000);
    
                        // 设置 progress 属性的值(通过属性改变监听器传递数据到事件调度线程)
                        setProgress(i); // 缺少该方法仍能运行,setProgress()作用为:设置进展约束属性。这个值应该从0到100
    
                        // 通过 SwingWorker 内部机制传递数据到事件调度线程
                        publish(i);
                    }
                    // 返回计算结果
                    return "下载完成";
                }
    
                @Override
                protected void process(List<Integer> chunks) {
                    // 此方法在 调用 doInBackground 调用 public 方法后在事件调度线程中被回调
                    Integer progressValue = chunks.get(0);
                    textArea.append("已下载: " + progressValue + "%\n");
                }
    
                @Override
                protected void done() {
                    // 此方法将在后台任务完成后在事件调度线程中被回调
                    String result = null;
                    try {
                        // 获取计算结果
                        result = get();// get返回doInBackground()返回类型
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    label.setText(result);
                    textArea.append(result);
                }
            };
    
            // 添加属性改变监听器
            task.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if ("progress".equals(evt.getPropertyName())) {
                        Object progressValue = evt.getNewValue();
                        label.setText("正在下载: " + progressValue + "%");
                    }
                }
            });
    
            // 启动任务
            task.execute();
        }
    }
    

    以上代码改编自https://blog.csdn.net/xietansheng/article/details/78389265

    注:doInBackground方法作为任务线程的一部分执行,它负责完成线程的基本任务,并以返回值来作为线程的执行结果。继承类须覆盖该方法并确保包含或代理任务线程的基本任务。不要直接调用该方法,应使用任务对象的execute方法来调度执行。
    当从任务线程调用publish方法时,SwingWorker类调度process方法,如果SwingWorker通过publish发布了一些数据,那么也应该实现process方法来处理这些中间结果,任务对象的父类会在事件分发线程上激活process方法,因此在此方法中程序可以安全的更新UI组件。
    无论何时调用setProgress方法,SwingWorker类都会产生一个propertyChangeEvent。setProgress方法设置一个0到100之间的新的进度值,这个值包装在PropertyChangeEvent中,这个事件的监听器使用getNewValue()方法获取进度值。

    刚写博客各位多支持以下鸭

    展开全文
  • SwingWorker分析

    2014-05-29 00:52:46
    SwingWorker可以帮助我们在后台执行耗时的任务,而避免阻塞我们的应用程序,以让用户感觉不爽。SwingWorker有2个参数T , VT:为最终结果集 【&lt;T&gt; the result type returned by this SwingWorker's ...

    SwingWorker可以帮助我们在后台执行耗时的任务,而避免阻塞我们的应用程序,以让用户感觉不爽。
    SwingWorker有2个参数T , V
    T:为最终结果集 【<T> the result type returned by this SwingWorker's doInBackground and get methods】,由文档的介绍可以知道这个结果可以被doInBackground和get方法返回。
    V:为中间结果集【<V> the type used for carrying out intermediate results by this SwingWorker's publish and process methods】
    还要了解的是SwingWorker的几个流程:
    doInBackground是工作线程,他可以明确调用publich方法(注意publish方法只在SwingWorker类中实现),以发送中间结果V,然后这个中间结果有被发送到在EDT(事件派发线程)中的
    process方法中进行处理。
    当doInBackground处理完后,会自动调用done方法,由T类型的描述那里可以知道,在这个方法中可以调用get方法获取最终结果集,多好玩啊,哈哈。
    现在拿一段代码来分析下吧:

    import java.awt.Image;
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.SwingWorker;
    public class ImageLoadingWorker extends SwingWorker<List<Image>, String>{
    //看到没有继承与SwingWorker类了。T为List<Image>,说明最终结果集为List<Image>.没错,这个类就是用来加载图像,然后显示的
    //V类型为String,拉到下面看下,publish的参数是String吧
     private JTextArea logArea;
     private JPanel viewerPanel;
     private String[] fileNames;
     
     
     public ImageLoadingWorker(JTextArea logArea , JPanel viewerPanel , String[] fileNames){
      
      this.logArea = logArea;
      this.viewerPanel = viewerPanel;
      this.fileNames = fileNames;
      
     }
    //通过执行了SwingWorker的execute方法,然后就调用了doInBackground这个方法,对fileNames对应的Image进行加载。并在每一个图像
    //加载的同时用publish方法发送相应信息,这个信息会发送到process方法中进行处理,当然前提是你要重写process这个函数,以保证能按
    //照你的要求来进行显示,对吧
     @Override
     protected List<Image> doInBackground() throws Exception {
      // TODO Auto-generated method stub
      List<Image> images = new ArrayList<Image>();
      for(String imgName : fileNames){
       try {
        images.add(ImageIO.read(new File(imgName)));
        publish("loading " + imgName);
       } catch (Exception e) {
        // TODO: handle exception
        publish("error"+imgName);
       }
      }
      return images;
     }
    //done方法是在doInBackground处理完成后,才执行的。于是乎,每个图像都是加载好的了。只要添加进去就可以了。
    //这样,一个耗时的任务,就被SwingWorker轻松解决了。还有一点就是,done是在EDT中的,所以没有破坏Swing的
    //单线程模式,而把一切与GUI相关的操作,都放在了EDT中执行。
     @Override
     protected void done() {
      // TODO Auto-generated method stub
      try {
       //get() : Waits if necessary for the computation to complete, and then retrieves its result.
       for (Image image:get()) {
        viewerPanel.add(new JLabel(new ImageIcon(image)));
        viewerPanel.revalidate();
       }
      } catch (Exception e) {
       // TODO: handle exception
      }
     }
    //看看这个函数,参数为List<String> chunks,这个参数名字你是可以改的,但是类型就别改了,否则的话,publish发给类本身的了,你重写
    //的就没意义了,如V类型所述,类型还是String。
     @Override
     protected void process(List<String> chunks) {
      // TODO Auto-generated method stub
      for(String message:chunks){
       logArea.append(message);
       logArea.append("/r/n");
      }
     }  
    }

    展开全文
  • I'm new to Java, and I've had a look at some tutorials on SwingWorker, but I'm unsure how to implement it with the example code I gave in the previous question.Can anyone explain how to use SwingWorke...
  • 浅析SwingWorker

    2014-05-29 02:05:25
    从Java SE 6开始引进的SwingWorker能帮你轻松的编写多线程Swing程序,改善你Swing程序的结构,提高界面响应的灵活性。SDN(Sun developer Network)上有一篇很好的文章:Improve Application Performance With ...
  • SwingWorker的替代品,用于在Swing中执行异步任务。 我们将SwingWorker.java与Action接口合并,生成AbstractAsynchronousAction.java。 此类的具体扩展可以用来代替任何Action。
  • 208.SwingWorker

    2020-02-21 18:21:30
    Swing程序UI界面只能使用EDT线程来...http://www.oracle.com/technetwork/articles/javase/swingworker-137249.html#Right 翻译: http://blog.sina.com.cn/s/blog_4b6047bc010007so.html Image Search示例的...
  • swingworker 如果要使用Swing用J​​ava编写桌面或Java Web Start程序,您可能会觉得需要通过创建自己的线程在后台运行某些程序。 没有什么可以阻止您在Swing中使用标准的多线程技术,并且需要遵循通常的注意事项...
  • java SwingWorker

    千次阅读 2012-08-22 13:58:07
    new SwingWorker() { @Override protected String doInBackground() throws Exception { System.out.println("开始执行后台方法..."); LogInfo.appendLog("开始执行后台
  • 主要介绍了在Java的Swing编程中使用SwingWorker线程模式及顶层容器的方法,适用于客户端图形化界面软件的开发,需要的朋友可以参考下
  • SwingWorker的使用

    千次阅读 2014-07-08 19:35:30
    [java] view plaincopy ...SwingWorker可以帮助我们在后台执行耗时的任务,而避免阻塞我们的...T:为最终结果集 【 the result type returned by this SwingWorker's doInBackground and get met
  • Modulejava.desktop ...Class SwingWorker<T,​V> java.lang.Object javax.swing.SwingWorker<T,​V> Type Parameters: T- the result type returned by thisSwingWorker...
  • swingworker笔记

    千次阅读 2009-03-05 10:21:00
    swingworker使用说明1、创建swingworker实例,并在构造函数中引入任务执行的必要参数 PrimeNumbersTask task = new PrimeNumbersTask(textArea, otherParam); textArea 用来显示动态的处理结果 otherParam 其他...
  • SwingWorker 简单使用方法

    千次阅读 2015-05-29 23:20:59
    SwingWorker 设计用于需要在后台线程中运行长时间运行任务的情况,并可在完成后或者在处理过程中向 UI 提供更新。SwingWorker 的子类必须实现 doInBackground() 方法,以执行后台计算。 工作流 SwingWorker 的...
  • 使用SwingWorker之二

    2014-03-11 09:35:53
    使用SwingWorker之二 (2007-01-29 10:04:40) 转载▼   分类:Swing SwingWorker基础  本节简要介绍SwingWorker的功能。SwingWorker的定义如下: public abstract class SwingWorker ...
  • Java Swing中的SwingWorker

    2019-09-29 13:53:56
    Swing中的SwingWorker主要是用来执行比较耗时的任务。 Java doc文档中中包含了一些简单的例子。 An abstract class to perform lengthy GUI-interaction tasks in a background thread. Several background ...
  • 使用SwingWorker类完成耗时操作

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,321
精华内容 528
关键字:

swingworker