java Список имен файлов в jtextarea через задачу - PullRequest
1 голос
/ 15 июня 2011

Я получил коллекцию файлов (apache commons.io), теперь я хочу перечислить тему в jTextArea, и я пытаюсь сделать это с помощью задачи. К сожалению, текстовое поле содержит только первый файл. Но в doInBackground я могу напечатать цикл, и все файлы будут перечислены.

Я хочу добавить строку в текстовое поле для каждого имени файла в тот момент, когда я его перебираю.

private class MyDeleteTask extends Task<String, String> {

    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);

        for (File f : files) {
            publish(f.getAbsolutePath());
        }

        return "";
    }

    @Override
    protected void process(List<String> values) {
        jTextArea.append(values.get(0) + "\n");
    }
}

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

Если честно, я не думаю, что вы используете 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(), что в данном случае намного эффективнее.

2 голосов
/ 15 июня 2011

Вы принимаете только первое значение. values.get(0) вернет только первый элемент в списке, а не все элементы в списке.Попробуйте это:

@Override
protected void process(List<String> values) {
    for(String str:values)
      jTextArea.append(str + "\n");
}
1 голос
/ 15 июня 2011
    @Override
    protected void process(List<String> values) {
        for( String str : values )
        {
           jTextArea.append(str + "\n");
        }
    }
1 голос
/ 15 июня 2011

Похоже, опубликованный код неверен.Вы вызываете метод publish (), который не описан, но используете метод process (), передающий список строк.

Думаю, вам следует использовать в процессе

for (String fName:values) {
  jTextArea.append(fName + "\n");
}
1 голос
/ 15 июня 2011
jTextArea.append(values.get(0) + "\n");

Вы используете 0-е значение ... попробуйте повторить его с циклом for.

...