在 JFrame 类中调用 File 方法是一个很好的做法吗?



在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事件调度线程解释

相关内容

  • 没有找到相关文章