`
javahacker2
  • 浏览: 43822 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SwingWorker分析

 
阅读更多

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

分享到:
评论

相关推荐

    jdk_swing_源码实现分析

    6. **SwingWorker**:为了实现后台任务处理,Swing引入了SwingWorker类。它允许在事件调度线程之外执行耗时的操作,同时提供更新UI的能力,确保UI的响应性。 7. **JTable和JTree**:这两个组件是Swing中的数据展示...

    查询分析器

    例如,使用ExecutorService进行并发查询,或者利用SwingWorker来更新UI而不阻塞主线程。对于大型查询,他们可能还实现了分页显示,以避免一次性加载大量数据导致内存压力。 文件名"sqlplusworksheet"可能包含了这个...

    Eclipse编写的把网页保存成图片Demo

    这个过程通常被称为网页截图或网页捕获,对于自动化测试、数据分析、内容记录等多种用途都非常有用。我们将重点讲解如何在Eclipse 4.2.1环境下构建一个简单的Java应用,该应用能够抓取网页并将其保存为图像。 首先...

    Java程序中图形界面案例的分析与研究.zip

    Swing提供了SwingWorker类,方便在后台执行计算并更新界面。 6. **对话框和组件间通信**:JOptionPane提供了一种简单的方法来显示警告、询问、输入对话框。此外,Java还支持自定义对话框,例如JOptionPane、JDialog...

    Swing速度慢和反映迟钝原因

    #### 原因分析 Swing作为Java图形用户界面(GUI)开发的重要框架之一,在实际应用中可能会出现速度慢和响应迟钝的问题。这类问题主要源于程序员对Swing事件处理机制的理解不足。 - **事件处理机制不当**:Swing使用...

    Runtime 源码分析

    在Java编程语言中,`Runtime`类是每...6. **SwingWorker**:用于在后台线程执行耗时任务,防止阻塞用户界面。 以上是关于`Runtime`源码分析和Java Swing的基本介绍,这些知识对于深入理解和开发Java应用程序至关重要。

    JFreeChart异步加载和解决缓存问题

    JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的图表,如柱状图、饼图、线形图、散点图等,广泛应用于数据分析、报告生成和GUI应用中。在处理大量数据或复杂的图表时,JFreeChart的性能可能会成为...

    Java显示数据表格的例子.rar

    6. **SwingWorker**: 当处理大量数据或进行耗时操作(如加载远程数据)时,为了避免阻塞用户界面,你可以使用 `SwingWorker` 类。它允许在后台线程中执行任务,并在完成后更新 `JTable`。 7. **JavaFX TableView**:...

    自己开发的较全面的swing案例

    Swing是Java编程环境中用于构建图形用户界面(GUI)的一个库,它提供了丰富的组件和功能,使得开发者可以创建出美观且...通过深入研究和分析这些代码,开发者可以提升自己的Swing编程技巧,更好地理解和运用这些技术。

    Java-JFC编程资料汇总

    它可能包含更深入的内容,比如Swing与AWT的区别、Swing中的JApplet和JFrame、Nimbus Look and Feel、SwingWorker用于后台任务处理、以及如何自定义Swing组件等。 4. **JFC核心编程第2版.pdf**:这是一本关于JFC的...

    swing2

    8. **SwingWorker**:为了解决Swing组件在事件调度线程中执行耗时操作会导致界面冻结的问题,Swing引入了SwingWorker类。它允许在后台线程执行计算任务,并在完成时更新界面,确保了UI的响应性。 9. **工具包和辅助...

    SwingDemo_20231007.zip

    SwingDemo_20231007.zip...通过学习和分析SwingDemo中的示例代码,开发者可以深入了解Swing的工作原理,提升在Java GUI编程方面的能力。同时,这些示例也可以作为创建自己应用程序的基础,帮助快速搭建和定制用户界面。

    swing练习1.zip

    8. **Swingworker**:当需要进行耗时操作时,使用Swingworker来避免阻塞UI线程,确保用户界面的响应性。 9. **国际化(i18n)**:Swing支持多语言应用,理解如何使用ResourceBundle实现资源的国际化。 10. **外观...

    用Swing写的一个RPG游戏

    通过阅读和分析源码,开发者可以学习到如何将Swing应用于游戏开发,理解游戏逻辑的实现,以及如何组织和管理一个大型Java项目的结构。这对于想要学习Java GUI编程和游戏开发的人来说,是一份宝贵的教育资源。 总之...

    翻窗口游戏

    通过分析和运行这个游戏的源代码,我们可以更深入地了解其具体实现细节和设计思路。 总的来说,“翻窗口游戏”是一个利用Java Swing技术实现的轻量级游戏,它展示了Swing在GUI编程中的应用,同时也可能涉及到了多...

    Java弹球项目代码实现

    线程管理确保游戏的运行不会阻塞用户界面,通常使用SwingUtilities.invokeLater或SwingWorker来实现。 在弹球游戏中,开发者需要实现以下核心功能: 1. 弹球的初始化:设置初始位置、速度和方向。 2. 撞击检测:...

    1106.swing记事本源码.zip

    5. **线程安全**:由于Swing不是线程安全的,所以在进行耗时操作(如读写文件)时,通常使用`SwingUtilities.invokeLater()`或`SwingWorker`来避免阻塞用户界面。 通过对"1106.swing记事本源码"的学习,开发者可以...

    java 类似于google搜索提示的功能,文本框输入提示

    Java提供了`SwingWorker`或`ExecutorService`来实现异步操作。 5. UI更新:当得到建议列表后,将其显示在下拉菜单或类似的UI组件中。Java Swing或JavaFX提供丰富的组件库来实现这一功能。 6. 源码实践:你提到的...

    java开发页面进度条

    通过上述分析可以看出,使用Java Swing开发页面进度条是一种实用且灵活的方法。它不仅能够满足基本的进度显示需求,还能够通过扩展来实现更加复杂的功能。这对于提升应用程序的用户体验具有重要意义。

    简单文件搜索器的实现

    可能包括了`FileFilter`类的使用,以过滤出符合搜索条件的文件,以及`SwingWorker`的使用,以在后台线程执行搜索任务,避免阻塞UI。 总的来说,这个项目提供了学习Java GUI编程、文件I/O操作、事件处理和多线程的...

Global site tag (gtag.js) - Google Analytics