|
今天看来一点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(); } } }
}
|