再次挣扎。
我递归地搜索一个目录,并通过检查它们的扩展名来挑选音频文件。一旦找到,每个都将添加到一个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名称约定方法,名称从情人大小写字母开始。