Если честно, я не думаю, что вы используете Task
(на самом деле SwingWorker
подкласс) лучший способ для вашей ситуации.
publish()
полезен только тогда, когда вы можете вызвать егомежду фоновыми шагами, каждый из которых является длительным;это не так, потому что я сомневаюсь, что f.getAbsolutePath()
занимает очень много времени.
Я бы предпочел простой рефакторинг следующим образом:
private class MyDeleteTask extends Task<String, Void> {
public MyDeleteTask(Application app) {
super(app);
}
@Override
protected String doInBackground() throws Exception {
File file = new File("c:/files");
Collection<File> files = FileUtils.listFiles(file, null, true);
StringBuilder paths = new StringBuilder();
boolean first = true;
for (File f : files) {
if (first) {
first = false;
} else {
paths.append('\n');
}
paths.append(f.getAbsolutePath());
}
return paths;
}
@Override
protected void succeeded(String value) {
jTextArea.setText(value);
}
}
Здесь я думаю, что предпочтительнее рассчитатьвсе содержимое текстовой области в фоновом режиме (манипулирование строками может занять много времени, если у вас много файлов для отображения в списке), и, таким образом, также избегать многократных вызовов jTextArea.append()
(который, я считаю, интенсивно использует процессор, но на этот раз непосредственно внутриEDT, который является плохим и может привести к «зависанию GUI» на потенциально долгое время) и заменить их одним вызовом setText()
, что в данном случае намного эффективнее.