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;
}
利用SwingWorker,从文件中读取内容,显示到JTextArea中
最新推荐文章于 2021-02-28 05:44:11 发布