Det finns ingen anledning att skapa rot-noden i konstruktorn och sen skicka med den till den rekursiva metoden där den fylls på, det är inte särskilt snyggt. Anropa istället metoden med startfoldern och låt metoden själv konstruera hela trädet inklusive roten.
Anledningen till att din rekursiva metod inte fungerar är för att den helt enkelt inte är rekursiv, i första anropet så itererar du igenom subfoldrarna i startfoldern, skapar nodobjekt av dessa kataloger och adderar dessa till ditt träd, men sen så anropar metoden sig själv med ytterligare ett nyskapat nodobjekt (som du ju precis redan hade skapat) utan att göra något med resultatet från metodanropet, alltså kommer endast förstanivån i folderstrukturen att läggas till i trädet.
För att det skall bli ett rekursivt anrop så måste du addera resultatet från metodanropet till ditt träd, nu så gör du ingenting med det överhuvudtaget.
Detta:
topNode.add(new DefaultMutableTreeNode(files[i].toString()));
addNodes(new DefaultMutableTreeNode(files[i].toString()), files[i]);
Skall se ut så här:
topNode.add(addNodes(new DefaultMutableTreeNode(files[i].toString()), files[i]));
Så här skulle jag skriva metoden, utan att skicka med en onödigt rotnod i metodanropet:
private DefaultMutableTreeNode getTree(File dir) {
DefaultMutableTreeNode topNode = new DefaultMutableTreeNode(dir);
if (dir.exists() && dir.isDirectory()){
File[] files = dir.listFiles();
for(int i = 0; i < files.length; i++) {
File f = files[i];
if(f.isDirectory()) {
topNode.add(getTree(f));
}
}
}
return topNode;
}
Och sen anropa denna metod i konstruktorn så här:
JTree tree = new JTree(getTree(dir));
Snyggare och enklare att läsa.
