2016-06-22 17 views
1

Um eine JTree und Einfügen neue Knoten, die durch nur zu wissen, String Pfad zu erstellen, schrieb ich die folgenden Zeilen:Wie erstellt man einen Knoten mit der Zeichenfolge JTree?

private JFrame frame; 
JTree tree; 
DefaultMutableTreeNode root; 
DefaultTreeModel model; 

public static void main(String[] args) 
{ 
    test t = new test(); 
    t.add_new_folder("Data","trial 0"); 
    t.add_new_folder("Data/trial 0","trial 1"); 
    t.frame.revalidate(); 
    t.frame.repaint(); 

} 
public test() 
{ 
    frame = new JFrame(); 
    tree = new JTree(); 
    root = new DefaultMutableTreeNode("Data"); 
    model = new DefaultTreeModel(root); 
    tree.setModel(model); 
    frame.getContentPane().add(tree, BorderLayout.WEST); 
    frame.setVisible(true); 
    frame.setSize(500, 500); 
} 

bis hier alles sieht gut aus und funktioniert, aber wenn dieses Verfahren es das nicht aufgerufen wird, nicht tun erwarteten Ergebnisse

public void add_new_folder(String path,String name){ 
    String[] data = path.split("/"); 
    TreePath t = new TreePath(data); 
    DefaultMutableTreeNode parent = new DefaultMutableTreeNode(t); 
    model.insertNodeInto(new DefaultMutableTreeNode(name), parent, parent.getChildCount()); 
    model.reload(); 
} 

und das ist, was ich

enter image description here

bekommen

Wie repariert man es dann?

Antwort

4

diesen Code versuchen:

public class Test { 
    private JFrame frame; 
    JTree tree; 
    DefaultMutableTreeNode root; 
    DefaultTreeModel model; 
    private Map<String, DefaultMutableTreeNode> treeMap; 

    public static void main(String[] args) 
    { 
     Test t = new Test(); 
     t.add_new_folder("Data","trial 0"); 
     t.add_new_folder("Data/trial 0","trial 1"); 
     t.frame.revalidate(); 
     t.frame.repaint(); 
    } 

    public Test() 
    { 
     frame = new JFrame(); 
     tree = new JTree(); 
     root = new DefaultMutableTreeNode("Data"); 
     model = new DefaultTreeModel(root); 
     tree.setModel(model); 
     frame.getContentPane().add(tree, BorderLayout.WEST); 
     frame.setVisible(true); 
     frame.setSize(500, 500); 
     treeMap = new HashMap<>(); 
     treeMap.put("Data", root); 
    } 

    public void add_new_folder(String path,String name){ 
     DefaultMutableTreeNode currentNode = treeMap.get(path); 
     DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(name); 
     currentNode.add(childNode); 
     treeMap.put(path+"/"+name, childNode); 
     model.reload(); 
    } 
} 

Ich weiß, wenn es ist, was Sie wollen, aber es kann eine Führung zu folgen;)

+0

schön :) ..eine Idee, warum meins nicht funktioniert? danke –

+0

Weil du deine Knoten nicht in die Wurzel eingefügt hast –

3

Versuchen zu bestimmten Knoten zu durchlaufen und die TreePath zu bekommen. Der unten stehende Code sollte Ihnen helfen.

public void add_new_folder(String path,String name){ 
     String[] data = path.split("/"); 

     TreePath tPath = findPath(data[data.length-1]); 
     if(tPath != null){ 
      ((DefaultMutableTreeNode)tPath.getLastPathComponent()).add(new DefaultMutableTreeNode(name)); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    private TreePath findPath(String s) { 
     DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot(); 
     Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration(); 
     while (e.hasMoreElements()) { 
      DefaultMutableTreeNode node = e.nextElement(); 
      if (node.toString().equalsIgnoreCase(s)) { 
       return new TreePath(node.getPath()); 
      } 
     } 
     return null; 
    }