java 简单示例关于swingworker

来源:互联网 发布:php多进程编程实例 编辑:程序博客网 时间:2024/05/22 02:27

今天看来一点java的swingworker难怪我之前写的界面加线程不起作用。当java中界面有涉及到线程,且线程可能会对流进行处理,这个时候用swingworker最好不过了。

我将书上的代码记录下来。也算练习了一遍

/**
 * author:zr
 * date:2013/4/17
 * Frame has a text area to show the contents of a text file,a menu to open a file and cancel the opening
 * process ,and a status line to show the file loading progress
 **/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.concurrent.*;

import javax.swing.*;
public class SwingWorkerTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  EventQueue.invokeLater(new Runnable()
  {
   public void run()
   {
    JFrame frame=new SwingWorkerFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
  }
    );

 }

}
//

class SwingWorkerFrame extends JFrame
{
 private JFileChooser chooser;
 private JTextArea textArea;
 private JLabel statusLine;
 private JMenuItem openItem;
 private JMenuItem  cancelItem;
 private SwingWorker<StringBuilder, ProgressData>  textReader;
 public static final int DEFAULT_WIDTH=450;
 public static final int DEFAULT_HEIGHT=350;
 
   
     public SwingWorkerFrame ()
   {
    chooser=new JFileChooser();
    chooser.setCurrentDirectory(new File("."));
   
   
    textArea=new JTextArea();
    add(new JScrollPane(textArea));
       setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
      
       statusLine=new JLabel();
       add(statusLine,BorderLayout.SOUTH);
      
       JMenuBar menuBar=new JMenuBar();
       setJMenuBar(menuBar);
      
       JMenu  menu=new JMenu("File");
       menuBar.add(menu);
      
       openItem=new JMenuItem("Open");
       menu.add(openItem);
       openItem.addActionListener(new ActionListener()
       {
        public void actionPerformed(ActionEvent e)
        {
         int result=chooser.showOpenDialog(null);
         if(result==JFileChooser.APPROVE_OPTION)
         {
          textArea.setText("");
          openItem.setEnabled(false);
          textReader=new TextReader(chooser.getSelectedFile());
         textReader.execute();
          cancelItem.setEnabled(true);
         }
        }
       }
         );
       cancelItem=new JMenuItem("cancel");
       menu.add(cancelItem);
       cancelItem.setEnabled(false);
       cancelItem.addActionListener(new ActionListener()
       {
        public void actionPerformed(ActionEvent e)
        {
         textReader.cancel(true);
        }
       } );
      
     }
    
    
     private class ProgressData
     {
      public int number;
      public String line;
     }
    
    
     private class TextReader extends SwingWorker<StringBuilder,ProgressData>
     {
             private File file;
             private StringBuilder text=new StringBuilder();
            
             TextReader(File _file)
             {
              this.file=_file;
             }
  @Override
  protected StringBuilder doInBackground() throws Exception {
   int lineNumber=0;
   Scanner in=new Scanner(new FileInputStream(file));
   while(in.hasNext())
   {
    String line=in.nextLine();
    lineNumber++;
    text.append(line);
    text.append("\n");
    ProgressData data=new ProgressData();
    data.number=lineNumber;
    data.line=line;
    publish(data);
    Thread.sleep(1000);  //使过程更加的明显
    
    
   }
   return text;
  }
  
  
  
  public void process(List<ProgressData> data)
  {
     if(isCancelled())
      return ;
     StringBuilder b=new StringBuilder();
     statusLine.setText(""+data.get(data.size()-1).number);
     for(ProgressData d:data)
     {
      b.append(d.line);
      b.append("\n");
     
     }
     //text.append(b.toString());
    
    textArea.append(b.toString());
  
   
  }
  
  public void done()
  {
   StringBuilder result;
   try {
    result = get();
    textArea.setText(result.toString());
    statusLine.setText("Done");
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   
  }
     
     }
    
    


}