Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 415|回复: 0

[Swing学习]SwingWorker使用一例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-16 00:01:39 | 显示全部楼层 |阅读模式
    从硬盘装载一组图像并显示已装载文件的名称。SwingWorker让你在一个后台线程中运行一个特定的任务,在EDT上发
    中间结果和最终结果。
    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. public class ImageLoader extends JFrame {
    5.     private JTextArea log;
    6.     private JPanel viewer;
    7.    
    8.     public ImageLoader() {
    9.         super("Image Loader");
    10.         
    11.         this.log = new JTextArea(4, 4);
    12.         this.viewer = new JPanel();
    13.         
    14.         JButton start = new JButton("Start");// 点击这个按钮开始一段长时间的任务。
    15.         start.addActionListener(new ActionListener() {
    16.            public void actionPerformed(ActionEvent e) {
    17.                String[] files = new String[] {
    18.                    "Bodie_small.png", "Carmela_small.png",
    19.                    "Unknown.png", "Denied.png",
    20.                    "Death Valley_small.png", "Lake_small.png"
    21.                };
    22.                new ImageLoadingWorker(log, viewer, files).execute();//后台工作线程开始工作
    23.            }
    24.         });
    25.         
    26.         add(new JScrollPane(log), BorderLayout.NORTH);
    27.         add(new JScrollPane(viewer), BorderLayout.CENTER);
    28.         add(start, BorderLayout.SOUTH);
    29.         
    30.         setSize(360, 280);
    31.     }
    32.    
    33.     public static void main(String... args) {
    34.         SwingUtilities.invokeLater(new Runnable() {
    35.             public void run() {
    36.                 new ImageLoader().setVisible(true);//初始化GUI
    37.             }
    38.         });
    39.     }
    40. }
    41. import java.util.List;
    42. import java.util.ArrayList;
    43. import java.io.File;
    44. import java.io.IOException;
    45. import java.awt.Image;
    46. import javax.swing.ImageIcon;
    47. import javax.swing.JLabel;
    48. import javax.swing.JPanel;
    49. import javax.swing.JTextArea;
    50. import javax.imageio.ImageIO;
    51. import javax.swing.SwingWorker;
    52. // Final result is a list of Image
    53. // Intermediate result is a message as a String
    54. //第一个类型参数指定doInBackground的返回类型。
    55. //第二个类型参数指定publish和process方法要处理的数据类型
    56. public class ImageLoadingWorker extends SwingWorker< List< Image>, String> {
    57.   private JTextArea log;
    58.   private JPanel viewer;
    59.   private String[] filenames;
    60.   public ImageLoadingWorker(JTextArea log, JPanel viewer, String... filenames) {
    61.     this.log = log;
    62.     this.viewer = viewer;
    63.     this.filenames = filenames;
    64.   }
    65. // In a thread
    66.   @Override
    67.   protected List< Image> doInBackground() {//后台的任务
    68.     List< Image> images = new ArrayList< Image>();
    69.     for (String filename : filenames) {
    70.       try {
    71.         images.add(ImageIO.read(new File(filename)));
    72.      //通过调用publish(),可以随时公布中间结果,publicsh()会依次调用EDT中的publish()
    73.         publish("Loaded " + filename);
    74.       } catch (IOException ioe) {
    75.         publish("Error loading " + filename);
    76.       }
    77.     }
    78.     return images;
    79.   }  
    80.   // In the EDT
    81. //后台任务完成后(即doInBackground()方法执行完成后),SwingWorker在EDT中自动调用done(),显示最终结果。
    82.   @Override
    83.   protected void done() {
    84.     try {
    85.       for (Image image : get()) {//一般会在done()方法中调用get()方法获取doInBackground()方法计算出来的值。
    86.         viewer.add(new JLabel(new ImageIcon(image)));
    87.         viewer.revalidate();
    88.       }
    89.     } catch (Exception e) { }
    90.   }
    91.   // In the EDT
    92.   @Override
    93. protected void process(List< String> messages) {
    94.     for (String message : messages) {
    95.       log.append(message);
    96.       log.append("
    97. ");
    98.     }
    99.   }

    100. }
    101. 运行结果:
    102. [img]http://www.java3z.com/cwbwebhome/article/article5/img9/swingworker33.jpg[/img]
    复制代码


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/16/000056031.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:48 , Processed in 0.289167 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表