webForumDet fria alternativet

Rekursiv JTree över mappar

2 svar · 431 visningar · startad av Re-JeeP

Re-JeePMedlem sedan sep. 200642 inlägg
#1

Hej!

Behöver hjälp med min klass som ska göra mig ett JTree rekursivt över mina mappar.

import javax.swing.*;
import javax.swing.tree.*;
import java.io.File;

public class FolderTree extends JPanel
{
	private File dir;
	
	public FolderTree(String path)
	{
		dir = new File(path);
		
		JTree tree = new JTree(addNodes(new DefaultMutableTreeNode(path), dir));
		JScrollPane scrollpane = new JScrollPane();
		scrollpane.getViewport().add(tree);
		add(scrollpane);
	}
	
	private DefaultMutableTreeNode addNodes(DefaultMutableTreeNode topNode, File dir)
	{
		File[] files = dir.listFiles();
		
		for(int i = 0; i < files.length; i++)
		{
			if(files[i].isDirectory())
			{
				topNode.add(new DefaultMutableTreeNode(files[i].toString()));
				addNodes(new DefaultMutableTreeNode(files[i].toString()), files[i]);
			}
		}
		
		return topNode;
	}
}
sgtpepperMedlem sedan apr. 20005 524 inlägg
#2

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.

Re-JeePMedlem sedan sep. 200642 inlägg
#3

Hej!

Jag håller helt och hållet med dig om att koden blir snyggare och det funkar fint nu.

Tackar!

Genererad på 374 ms · cache AV · v20260730165559-full.f96bc7eb