java通过任务列出jtextarea中的文件名

java通过任务列出jtextarea中的文件名,java,swing,task,jtextarea,Java,Swing,Task,Jtextarea,我得到了一个文件集合(apachecommons.io),现在我想在jTextArea中列出主题,并尝试通过一个任务来实现这一点。不幸的是,textarea只列出了第一个文件。但在doInBackground中,我可以打印一个循环,然后列出所有文件 我想在遍历每个文件名时,在文本区域中为每个文件名添加一行 private class MyDeleteTask extends Task<String, String> { public MyDeleteTask(Applica

我得到了一个文件集合(apachecommons.io),现在我想在jTextArea中列出主题,并尝试通过一个任务来实现这一点。不幸的是,textarea只列出了第一个文件。但在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");
    }
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
用于(文件f:文件){
发布(f.getAbsolutePath());
}
返回“”;
}
@凌驾
受保护的无效进程(列表值){
jTextArea.append(values.get(0)+“\n”);
}
}

您只获取第一个值。
值。get(0)
将只返回列表中的第一个元素,而不是列表中的所有元素。试试这个:

@Override
protected void process(List<String> values) {
    for(String str:values)
      jTextArea.append(str + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
jTextArea.append(str+“\n”);
}

您只获取第一个值。
值。get(0)
将只返回列表中的第一个元素,而不是列表中的所有元素。试试这个:

@Override
protected void process(List<String> values) {
    for(String str:values)
      jTextArea.append(str + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
jTextArea.append(str+“\n”);
}
您正在使用第0个值。。。尝试使用for循环对其进行迭代


您正在使用第0个值。。。尝试使用for循环对其进行迭代。

看起来发布的代码不正确。 调用publish()方法,该方法未被描述,但使用process()方法传递字符串列表

我猜你应该在这个过程中使用

for (String fName:values) {
  jTextArea.append(fName + "\n");
}

看起来发布的代码不正确。 调用publish()方法,该方法未被描述,但使用process()方法传递字符串列表

我猜你应该在这个过程中使用

for (String fName:values) {
  jTextArea.append(fName + "\n");
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
{
jTextArea.append(str+“\n”);
}
}
@覆盖
受保护的无效进程(列表值){
for(字符串str:values)
{
jTextArea.append(str+“\n”);
}
}

老实说,我不认为您正在使用
任务
(实际上是
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);
    }
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
StringBuilder路径=新建StringBuilder();
布尔值优先=真;
用于(文件f:文件){
如果(第一){
第一个=假;
}否则{
append('\n');
}
append(f.getAbsolutePath());
}
返回路径;
}
@凌驾
受保护的无效已成功(字符串值){
jTextArea.setText(值);
}
}

在这里,我认为最好是在后台计算整个文本区域的内容(如果有很多文件要列出,字符串操作可能需要很长时间),这样也可以避免多次调用
jTextArea.append()
(我相信这会占用大量CPU,但这次直接在EDT内部,这是不好的,可能会导致“GUI冻结”可能很长一段时间),并用对
setText()
的一次调用来替换它们,在这种情况下,该调用的性能要高得多。

老实说,我不认为您使用
任务
(实际上是
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);
    }
}
私有类MyDeleteTask扩展了任务{
公共MyDeleteTask(应用程序应用程序){
超级(app);
}
@凌驾
受保护的字符串doInBackground()引发异常{
文件文件=新文件(“c:/files”);
Collection files=FileUtils.listFiles(file,null,true);
StringBuilder路径=新建StringBuilder();
布尔值优先=真;
用于(文件f:文件){
如果(第一){
第一个=假;
}否则{
append('\n');
}
append(f.getAbsolutePath());
}
返回路径;
}
@凌驾
受保护的无效已成功(字符串值){
jTextArea.setText(值);
}
}

在这里,我认为最好是在后台计算整个文本区域的内容(如果有很多文件要列出,字符串操作可能需要很长时间),这样也可以避免多次调用
jTextArea.append()
(我相信这会占用大量CPU,但这次直接在EDT内部,这是不好的,可能导致GUI冻结”可能很长一段时间),并用对
setText()
的单个调用替换它们,在这种情况下,该调用的性能要高得多。

publish()
函数做什么。还有
jTextAera.append()
只从
列表中获取第一个
字符串
。publish是一个未实现的方法。它是一个(通常)未使用的任务方法。它只是为进程提供一个列表。
publish()
函数做什么。还有
jTextAera.append()
正在获取