JTree knoten wird nicht übernommen

brainjay

Mitglied
Hi Leute,

ich bin langsam am verzweifeln. Ich habe euch mal den Code rauskopiert, mit dem ich Probleme habe.
Ich versuche mir einen Baum anzulegen, der 10 Knoten haben die Kind 0, Kind 1 ... Kind n heißen.
Anschließend möchte ich Kind 1, 5 Knoten hinzufügen (mit dem Namen "Noch ein Kind 1" , "Noch ein Kind 2 usw.). Wenn ich nun den Baum expandieren will, besitzt Kind 1 keine Kinder... und ich weiß nicht wieso. Ich hoffe das mir jemand weiterhelfen kann. Ach ja das ding hat keine GUI sondern muss debuggt werden 🙂 Danke für eure Hilfe

Java:
public class Probs {
	
	static DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
	static DefaultTreeModel model = new DefaultTreeModel(root);
	static JTree tree = new JTree(model);

	public static void expandAll(boolean expand){
		TreeNode n = (TreeNode)tree.getModel().getRoot();
		expandAll(new TreePath(n), expand);
	}

	private static void expandAll(TreePath parent, boolean expand){

		TreeNode node = (TreeNode)parent.getLastPathComponent();
		int count = node.getChildCount();

		if(count >=0){
			for(Enumeration e = node.children(); e.hasMoreElements(); ){
				TreeNode n = (TreeNode)e.nextElement();
				TreePath path = parent.pathByAddingChild(n);
				System.out.println("KIND "+ n.toString());
				expandAll(path, expand);
			}
		}

		if(expand){
			tree.expandPath(parent);
		}
		else{

			tree.collapsePath(parent);
		}
	}
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub


		for(int i =0; i < 10; i++){
			DefaultMutableTreeNode node = new DefaultMutableTreeNode("Kind " + i);
			model.insertNodeInto(node, root, root.getChildCount());
		}

		Object[] objects = new Object[2];
		DefaultMutableTreeNode kind =new DefaultMutableTreeNode("Kind 1");
		objects[0] = new DefaultMutableTreeNode(tree.getModel().getRoot());
		kind.setParent(root);
		objects[1] = kind;
		TreePath treepath = new TreePath(objects);



		for(int i = 0; i < 5; i++){
			DefaultMutableTreeNode child = new DefaultMutableTreeNode("Noch ein kind"+i);
			//node2 = (DefaultMutableTreeNode) tp.getLastPathComponent();
			DefaultMutableTreeNode node2 = (DefaultMutableTreeNode) treepath.getLastPathComponent();

			model.insertNodeInto(child, node2, node2.getChildCount());
			int counter =node2.getChildCount();
			System.out.println("ss");

			for(int p = 0; p < counter; p ++){
				System.out.println("Kindname: " + node2.getChildAt(p).toString());
			}
			TreeNode[] path = model.getPathToRoot(node2);
			tree.expandPath(new TreePath(path));
		}

		expandAll(true);


	}

}
 
Hier mit GUI:

Java:
package test;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import java.awt.BorderLayout;
import java.util.Enumeration;

public class Tes {

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

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Tes window = new Tes();
					window.frame.setVisible(true);
					window.addTree();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public Tes() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		root = new DefaultMutableTreeNode("root");
		model = new DefaultTreeModel(root);
		tree = new JTree(model);
		frame.getContentPane().add(tree, BorderLayout.CENTER);
	}
	
	public void addTree(){
		for(int i =0; i < 10; i++){
			DefaultMutableTreeNode node = new DefaultMutableTreeNode("Kind " + i);
			model.insertNodeInto(node, root, root.getChildCount());
		}

		Object[] objects = new Object[2];
		DefaultMutableTreeNode kind =new DefaultMutableTreeNode("Kind 1");
		objects[0] = new DefaultMutableTreeNode(tree.getModel().getRoot());
		kind.setParent(root);
		objects[1] = kind;
		TreePath treepath = new TreePath(objects);

		for(int i = 0; i < 5; i++){
			DefaultMutableTreeNode child = new DefaultMutableTreeNode("Noch ein kind"+i);
			//node2 = (DefaultMutableTreeNode) tp.getLastPathComponent();
			DefaultMutableTreeNode node2 = (DefaultMutableTreeNode) treepath.getLastPathComponent();

			model.insertNodeInto(child, node2, node2.getChildCount());
			int counter =node2.getChildCount();
			System.out.println("ss");
			
			for(int p = 0; p < counter; p ++){
				System.out.println("Kindname: " + node2.getChildAt(p).toString());
				model.nodeStructureChanged(node2);
			}
			TreeNode[] path = model.getPathToRoot(node2);
			tree.expandPath(new TreePath(path));
		}

		expandAll(true);
	}
	
	public void expandAll(boolean expand){
		TreeNode n = (TreeNode)tree.getModel().getRoot();
		expandAll(new TreePath(n), expand);
	}

	private void expandAll(TreePath parent, boolean expand){

		TreeNode node = (TreeNode)parent.getLastPathComponent();
		int count = node.getChildCount();

		if(count >=0){
			for(Enumeration e = node.children(); e.hasMoreElements(); ){
				TreeNode n = (TreeNode)e.nextElement();
				TreePath path = parent.pathByAddingChild(n);
				System.out.println("KIND "+ n.toString());
				expandAll(path, expand);
			}
		}

		if(expand){
			tree.expandPath(parent);
		}
		else{

			tree.collapsePath(parent);
		}
	}

}
 
Der Code ist mir zu wüst, um den ernsthaft duch zu schauen.

Eventuell liegt es ja an setParent(MutableTreeNode newParent). Zumindest hörst sich der Kommentar in der Doku für mich so an, als würde ich die Methode nur in ganz speziellen Fällen nutzen wollen.
Sets this node's parent to newParent but does not change the parent's child array.

Allgemeiner Hinweis: DefaultMutableTreeNode kennt die Methode add(MutableTreeNode) um einem Knoten Kindknoten hinzuzufügen. (Das muss bei der Initialisierung nicht unbedingt über das Model laufen)
 
ich habs jetzt mal mit deiner methode probiert, leider fehlanzeige... ich glaube das hat damit zu tun das ich mir den TreePath selber zusammen bastle, denn wenn ich vom rootknoten einen knoten auswähle und den hinzufüge funktioniert es. Ich muss mir aber einen TreePath selber erstellen... Kennt jemand eine möglichkeit sich einen TreePath selber zu erstellen?
 
Warum über den TreePath einen Baum erzeugen?

Beim TreePath musst Du sicherstellen, dass sich darin die identischen Objekte/Nodes befinden, die sich auch im Tree befinden.
Wie ich das sehe erstellst Du zwischendurch neue TreeNodes und packst diese in einen TreePath. Auch wenn der TreePath dann genauso aussieht/aussehen sollte, als würde er aus dem Tree stammen, stammt er natürlich nicht aus diesem und der Versuch über diesen TreePath neue Knoten hinzuzufügen wird scheitern.
 

Zurück
Oben