您的位置:首页 > 其它

利用SwingWorker,从文件中读取内容,显示到JTextArea中

2012-05-22 08:21 381 查看
class SwingWorkerFrame extends JFrame {
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 fileMenu = new JMenu("File");
menuBar.add(fileMenu);

openItem = new JMenuItem("Open");
fileMenu.add(openItem);
openItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
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");
fileMenu.add(cancelItem);
cancelItem.setEnabled(false);
cancelItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
textReader.cancel(true);
}
});
}

private class ProgressData {
public int number;
public String line;
}

private class TextReader extends SwingWorker<StringBuilder, ProgressData> {

public TextReader(File file) {
this.file = file;
}

@Override
public StringBuilder doInBackground() throws Exception {
int lineNumber = 0;
Scanner in = new Scanner(new FileInputStream(file));

while(in.hasNextLine()) {
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(1);
}

return text;
}

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

textArea.append(b.toString());
}

@Override
public void done() {
try {
StringBuilder result = get();
textArea.setText(result.toString());
statusLine.setText("Done");
} catch (InterruptedException e) {
} catch (CancellationException e) {
textArea.setText("");
statusLine.setText("Cancelled");
} catch(ExecutionException e) {
statusLine.setText("" + e.getCause());
}

cancelItem.setEnabled(false);
openItem.setEnabled(true);
}

private File file;
private StringBuilder text = new StringBuilder();
}

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息