在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;
}
}
从字面上理解你的问题,它没有错。由于你可以定义自己的方法,并且代码结构在某种程度上取决于开发人员,所以在一个碰巧也扩展了JFrame
的类中进行文件处理在技术上没有错。
也就是说,我认为你实际上在问"从Swing方法(如filechooserButtonActionPerformed()
)中执行文件IO是一种好的做法吗?"这个问题的答案是明确的否定-永远不要这样做。
这些方法由Swing在UI线程(也称为事件调度线程)上调用,当UI线程等待这些方法返回时,应用程序将被冻结。它不能重新绘制,不能响应用户输入,什么都不能。因此,您希望将IO和其他长时间运行的工作卸载到其他线程。Swing文档中有一个很好的教程:第一课:Swing中的并发性。
另请参阅:Java事件调度线程解释