从txt文件读取时,JTextField无法正确更新

时间:2014-02-23 22:07:03

标签: java swing

我有一个奇怪的行为,当我单击开始按钮时,我想要一个名为status的JTextField来更改其文本以向用户显示该文件正在处理。但是应用程序只是开始处理.txt文件,并且在文件处理期间状态永远不会更新。

代码:

 private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    statusTextField.setText("Processing files.");
    int startLine = Integer.parseInt(startLineTextField.getText());

    try {
        if (selectedFile != null) {        
            if (selectedFile.getName().contains(".txt")) {                   
                mainController.start(new FileInputStream(selectedFile), startLine);

                statusTextField.setText("Finished !");
                mainController.displayFoundAccounts();
            } else if (selectedFile.getName().contains(".zip")) {
                ZipFile zipFile = new ZipFile(selectedFile);
                Enumeration<? extends ZipEntry> entries = zipFile.entries();

                while (entries.hasMoreElements()) {
                    ZipEntry entry = entries.nextElement();
                    InputStream inputStream = zipFile.getInputStream(entry);                       
                    mainController.start(inputStream, startLine);                      
                }

                statusTextField.setText("Finished !");
                mainController.displayFoundAccounts();
            }
        } else {
            System.out.println("No file selected.");
        }
    } catch (Exception ex) {
        System.out.println("Error: " + ex);
        Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
        statusTextField.setText("Stopped.");
    }
} 

由于第一行调用statusTextField.setText("Processing files.");,我不确定自己错在哪里。

1 个答案:

答案 0 :(得分:2)

您应该在不同的线程上处理文件,而不是在EDT上处理。可能这就是为什么更新不可见的原因。例如:

 private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
    statusTextField.setText("Processing files.");
    int startLine = Integer.parseInt(startLineTextField.getText());
    new Thread() {
      public void run() {
        try {
          if (selectedFile != null) {  
           ...      
          SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              statusTextField.setText("Finished !");
            }
          });
        } catch (Exception ex) {
          ...
        }
    }.start();
  }