递归地将文件添加到JList - 仅添加最后一个文件夹中的文件

时间:2014-09-09 08:51:57

标签: java file netbeans recursion jlist

再次挣扎。

我递归搜索目录并通过检查其扩展名来挑选音频文件。一旦找到,每个都将被添加到JList(在主类中 - 此处未显示)。但是,只有最后一个文件夹的文件被添加到列表中。这是代码:

public void List(String path) throws InterruptedException, IOException {

        File root = new File(path);
        File[] list = root.listFiles();
        DefaultListModel lm = new DefaultListModel();

        if (list == null) {
            return;
        }

        for (File f : list) {
            if (f.isDirectory()) {
                List(f.getAbsolutePath());

            } else if (f.isFile()) {
                String outPath = f.getAbsolutePath();
                try {
                    String ext = outPath.substring(outPath.lastIndexOf(".") + 1);
                    if (ext.equals("wma") || ext.equals("m4a") || ext.equals("mp3")) {
                        lm.addElement(f.getAbsolutePath());
                    }
                } catch (Exception e) {
                    System.out.println(outPath + " is not a valid file!!!!!");
                }
                HomeScreen.Library.setModel(lm);

            }

        }

    }

我尝试用简单的lm.addElement(f.getAbsolutePath())替换System.out.println(f.getAbsolutePath),并按预期打印出所有文件。我也尝试将HomeScreen.Library.setModel(lm);移到不同的区域,但这通常会导致没有任何内容添加到列表中。

我认为必须发生的是,每次找到新文件夹时,都会以某种方式重置列表模型,并将文件添加到现在为空的模型中。

有解决方法吗?我在代码中做了些什么,导致这种明显的重置?

非常感谢,

2 个答案:

答案 0 :(得分:1)

问题是您在DefaultListModel方法的每次调用中都会创建一个新的List()。这就解释了为什么你认为

  

每次找到新文件夹时,都会以某种方式重置列表模型,并将文件添加到现在空的模型中

我认为您希望将文件添加到同一DefaultListModel,因此请在List()方法之外创建它,并将其作为参数传递或将其设为List()的实例字段可以访问。

答案 1 :(得分:1)

您调用每个调用的tyme方法创建新模型。您需要创建一次模型并更新它。

我建议将DefaultListModel lm = new DefaultListModel();移出您的方法并传递参考。同时将HomeScreen.Library.setModel(lm);移出您的方法,并在方法调用之后将其放置。

DefaultListModel lm = new DefaultListModel();
some.List(path, lm);
HomeScreen.Library.setModel(lm);

PS:通过java名称约定,方法名称从情人案例字母开始。