我有一个奇怪的行为,当我单击开始按钮时,我想要一个名为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.");
,我不确定自己错在哪里。
答案 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();
}