在JFrame类中调用File方法(如读取文本文件)是一种很好的做法,如果不是,我该怎么办?谢谢你的回复。
这是我的代码:
private void filechooserButtonActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt", "text"));
fileChooser.setAcceptAllFileFilterUsed(false);
int returnVal = fileChooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
resultTextArea.setText(null);
filePathTextField.setText(fileChooser.getSelectedFile().getAbsolutePath());
try (BufferedReader buffReader = new BufferedReader(new FileReader(new File(fileChooser.getSelectedFile().getAbsolutePath())))) {
String line;
while ((line = buffReader.readLine()) != null) {
resultTextArea.append(line + "\n");
}
} catch (Exception exc) {
JOptionPane.showMessageDialog(MainGUI.this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
更新:我编辑了我的代码以使用SwingWorker,所以我希望它比以前更好:
private class textFileReader extends SwingWorker<Void, Void> {
@Override
protected Void doInBackground() throws Exception {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt", "text"));
fileChooser.setAcceptAllFileFilterUsed(false);
int returnVal = fileChooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
resultTextArea.setText(null);
filePathTextField.setText(fileChooser.getSelectedFile().getAbsolutePath());
try (BufferedReader buffReader = new BufferedReader(new FileReader(new File(fileChooser.getSelectedFile().getAbsolutePath())))) {
String line;
while ((line = buffReader.readLine()) != null) {
resultTextArea.append(line + "\n");
}
} catch (Exception exc) {
JOptionPane.showMessageDialog(MainGUI.this, "Error: " + exc, "Error", JOptionPane.ERROR_MESSAGE);
}
}
return null;
}
}
答案 0 :(得分:3)
从字面上看你的问题,它没有任何问题。由于您可以定义自己的方法,并且代码结构在某种程度上取决于开发人员,因此在类中进行文件处理时也没有任何技术上的错误,这也恰好扩展了JFrame
。
那就是说,我认为你实际上问的是“从Swing方法中做文件IO是一个好习惯,例如filechooserButtonActionPerformed()
?”和答案这个问题明确没有 - 永远不要这样做。
这些方法由UI线程上的Swing调用,也称为Event Dispatch Thread,当UI线程正在等待这些方法返回时,您的应用程序将被冻结。它无法重画,它无法响应用户输入,什么都没有。因此,您希望将IO和其他长时间运行的工作卸载到其他线程。 Swing文档中有一个很好的教程:Lesson: Concurrency in Swing。