在JFrame类中调用File方法是一个好习惯吗?

时间:2014-10-22 22:12:59

标签: java swing event-handling ui-thread

在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;
        }

    }

1 个答案:

答案 0 :(得分:3)

从字面上看你的问题,它没有任何问题。由于您可以定义自己的方法,并且代码结构在某种程度上取决于开发人员,因此在类中进行文件处理时也没有任何技术上的错误,这也恰好扩展了JFrame

那就是说,我认为你实际上问的是“从Swing方法中做文件IO是一个好习惯,例如filechooserButtonActionPerformed()”和答案这个问题明确没有 - 永远不要这样做。

这些方法由UI线程上的Swing调用,也称为Event Dispatch Thread,当UI线程正在等待这些方法返回时,您的应用程序将被冻结。它无法重画,它无法响应用户输入,什么都没有。因此,您希望将IO和其他长时间运行的工作卸载到其他线程。 Swing文档中有一个很好的教程:Lesson: Concurrency in Swing

另请参阅:Java Event-Dispatching Thread explanation