java 简单示例关于swingworker

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:32   2603   0

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


}

}


}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP