SwingWorker的使用

[java]  view plain copy
  1. SwingWorker可以帮助我们在后台执行耗时的任务,而避免阻塞我们的应用程序,以让用户感觉不爽。  
  2. SwingWorker有2个参数T , V  
  3. T:为最终结果集 【<T> the result type returned by this SwingWorker's doInBackground and get methods】,由文档的介绍可以知道这个结果可以被doInBackground和get方法返回。  
  4. V:为中间结果集【<V> the type used for carrying out intermediate results by this SwingWorker's publish and process methods】  
  5. 还要了解的是SwingWorker的几个流程:  
  6. doInBackground是工作线程,他可以明确调用publich方法(注意publish方法只在SwingWorker类中实现),以发送中间结果V,然后这个中间结果有被发送到在EDT(事件派发线程)中的  
  7. process方法中进行处理。  
  8. 当doInBackground处理完后,会自动调用done方法,由T类型的描述那里可以知道,在这个方法中可以调用get方法获取最终结果集,多好玩啊,哈哈。  
  9. 现在拿一段代码来分析下吧:  
  10.   
  11. import java.awt.Image;  
  12. import java.io.File;  
  13. import java.util.ArrayList;  
  14. import java.util.List;  
  15. import javax.imageio.ImageIO;  
  16. import javax.swing.ImageIcon;  
  17. import javax.swing.JLabel;  
  18. import javax.swing.JPanel;  
  19. import javax.swing.JTextArea;  
  20. import javax.swing.SwingWorker;  
  21. public class ImageLoadingWorker extends SwingWorker<List<Image>, String>{  
  22. //看到没有继承与SwingWorker类了。T为List<Image>,说明最终结果集为List<Image>.没错,这个类就是用来加载图像,然后显示的  
  23. //V类型为String,拉到下面看下,publish的参数是String吧  
  24.     private JTextArea logArea;  
  25.     private JPanel viewerPanel;  
  26.     private String[] fileNames;  
  27.       
  28.       
  29.     public ImageLoadingWorker(JTextArea logArea , JPanel viewerPanel , String[] fileNames){  
  30.           
  31.         this.logArea = logArea;  
  32.         this.viewerPanel = viewerPanel;  
  33.         this.fileNames = fileNames;  
  34.           
  35.     }  
  36. //通过执行了SwingWorker的execute方法,然后就调用了doInBackground这个方法,对fileNames对应的Image进行加载。并在每一个图像  
  37. //加载的同时用publish方法发送相应信息,这个信息会发送到process方法中进行处理,当然前提是你要重写process这个函数,以保证能按  
  38. //照你的要求来进行显示,对吧  
  39.     @Override  
  40.     protected List<Image> doInBackground() throws Exception {  
  41.         // TODO Auto-generated method stub  
  42.         List<Image> images = new ArrayList<Image>();  
  43.         for(String imgName : fileNames){  
  44.             try {  
  45.                 images.add(ImageIO.read(new File(imgName)));  
  46.                 publish("loading " + imgName);  
  47.             } catch (Exception e) {  
  48.                 // TODO: handle exception  
  49.                 publish("error"+imgName);  
  50.             }  
  51.         }  
  52.         return images;  
  53.     }  
  54. //done方法是在doInBackground处理完成后,才执行的。于是乎,每个图像都是加载好的了。只要添加进去就可以了。  
  55. //这样,一个耗时的任务,就被SwingWorker轻松解决了。还有一点就是,done是在EDT中的,所以没有破坏Swing的  
  56. //单线程模式,而把一切与GUI相关的操作,都放在了EDT中执行。  
  57.     @Override  
  58.     protected void done() {  
  59.         // TODO Auto-generated method stub  
  60.         try {  
  61.             //get() : Waits if necessary for the computation to complete, and then retrieves its result.   
  62.             for (Image image:get()) {  
  63.                 viewerPanel.add(new JLabel(new ImageIcon(image)));  
  64.                 viewerPanel.revalidate();  
  65.             }  
  66.         } catch (Exception e) {  
  67.             // TODO: handle exception  
  68.         }  
  69.     }  
  70. //看看这个函数,参数为List<String> chunks,这个参数名字你是可以改的,但是类型就别改了,否则的话,publish发给类本身的了,你重写  
  71. //的就没意义了,如V类型所述,类型还是String。  
  72.     @Override  
  73.     protected void process(List<String> chunks) {  
  74.         // TODO Auto-generated method stub  
  75.         for(String message:chunks){  
  76.             logArea.append(message);  
  77.             logArea.append("/r/n");  
  78.         }  
  79.     }         
  80. }  

你可能感兴趣的:(java,swing)