递归地将文件添加到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);
            }
        }
    }

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

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

有办法绕过这个吗?我是不是在代码中做了一些愚蠢的事情,导致了这种明显的重置?

非常感谢,

Guy

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

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

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

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

我的建议是将DefaultListModel lm = new DefaultListModel();从你的方法中移出并在其中传递引用。也将HomeScreen.Library.setModel(lm);从你的法中移出并将其放在方法调用之后。

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

PS:按照java名称约定方法,名称从情人大小写字母开始。

相关内容

  • 没有找到相关文章

最新更新