# JTree - Node mit ID versehen und auslesen



## ByeBye 31659 (1. Mai 2006)

Hallo,

ich hab in einer Datenbank Kategorien ablegt. Diese Kategorien verweisen durch eine ParentID teilweise auf eine höhere Kategorie.

Nun habe ich es geschafft diese mit Hilfe eines JTrees in einen JTree zu schreiben.
Dafür benutze ich eine sich rekursiv aufrufende Funktion.

Nun meine Frage, wie kann ich jedem JTree Eintrag, also einem Node, eine ID mitgeben, die der Benutzer nicht sieht, ich aber auslesen kann? Diese ID brauche ich später, um das ausgewählte Node einem Datenbankeintrag zuordnen zu können. Ich habe da leider überhaupt keine Idee zu :-(

Ich wäre für jeden Ratschlag dankbar.

Gruß
ExtremeSnail


----------



## flashray (1. Mai 2006)

Hallo,

schau mal hier:


```
import java.awt.BorderLayout;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class JTreeDemo extends JFrame {

	private JTree tree;

	private JLabel label = new JLabel(" ");

	public JTreeDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);

		DefaultMutableTreeNodewithID root = new DefaultMutableTreeNodewithID(
				"Wurzel", "Wurzel0");
		for (int ast = 0; ast < 4; ast++) {
			DefaultMutableTreeNodewithID node = new DefaultMutableTreeNodewithID(
					"Knoten " + ast);
			node.setNodeID("Ast" + ast);
			root.add(node);
			for (int blatt = 1; blatt < 4; blatt++)
				node.add(new DefaultMutableTreeNodewithID("Blatt "
						+ (ast * 3 + blatt), "BLatt" + blatt));
		}
		tree = new JTree(root);

		tree.getSelectionModel().addTreeSelectionListener(
				new TreeSelectionListener() {
					public void valueChanged(TreeSelectionEvent e) {

						label.setText(e.getPath()
								+ "\nNode ID:"
								+ ((DefaultMutableTreeNodewithID) tree
										.getLastSelectedPathComponent())
										.getNodeID());
					}
				});

		this.add(new JScrollPane(tree), BorderLayout.CENTER);
		this.add(label, BorderLayout.SOUTH);
		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new JTreeDemo();
	}

	class DefaultMutableTreeNodewithID extends DefaultMutableTreeNode {
		private String nodeID = "";

		public DefaultMutableTreeNodewithID(Object userObject) {
			super(userObject);
		}

		public DefaultMutableTreeNodewithID(Object userObject, String nodeID) {
			super(userObject);
			this.nodeID = nodeID;
		}

		public void setNodeID(String newNodeID) {
			this.nodeID = newNodeID;
		}

		public String getNodeID() {
			return nodeID;
		}
	}
}
```


Vg Erdal


----------



## ByeBye 31659 (1. Mai 2006)

Danke nun hab ich es 

Mir fehlte nur folgende Zeile den Rest hatte ich genauso auch schon versucht 


```
(DefaultMutableTreeNodewithID)tree.getLastSelectedPathComponent()).getNodeID());
```


----------



## Thomas Darimont (2. Mai 2006)

Hallo!

Also in dem Fall haette ich nicht mit einer eigenen TreeNode Klasse sondern mit dem UserObject gearbeitet... aber das nur mal so am Rande.

Gruss Tom


----------



## flashray (2. Mai 2006)

Hallo Tom,

ein mini Beispiel wie das mit dem userObject gedacht ist,  wäre von Vorteil. Schade ich dachte schon, ich hab das Problem ganz elegant gelöst :-(. Da ich wieder was dazu lernen werde, ist das dennoch ein Grund zum freuen .


Vg Erdal


----------



## Thomas Darimont (2. Mai 2006)

Hallo!


```
package de.tutorials;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class JTreeDemo extends JFrame {

    private JTree tree;

    private JLabel label = new JLabel(" ");

    public JTreeDemo() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationByPlatform(true);

        DefaultMutableTreeNode root = new DefaultMutableTreeNode(
                new UserObject("A", "AAAAA"));
        for (int ast = 0; ast < 4; ast++) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(
                    new UserObject("Ast" + ast, "Knoten " + ast));

            root.add(node);
            for (int blatt = 1; blatt < 4; blatt++)
                node.add(new DefaultMutableTreeNode(new UserObject("Blatt "
                        + (ast * 3 + blatt), "Blatt" + blatt)));
        }
        tree = new JTree(root);
        tree.getSelectionModel().addTreeSelectionListener(
                new TreeSelectionListener() {
                    public void valueChanged(TreeSelectionEvent e) {
                        DefaultMutableTreeNode selectedTreeNode = (DefaultMutableTreeNode) e
                                .getPath().getLastPathComponent();
                        UserObject userObject = (UserObject) selectedTreeNode
                                .getUserObject();
                        label.setText(e.getPath() + "\nNode ID:"
                                + userObject.getId());
                    }
                });

        this.add(new JScrollPane(tree), BorderLayout.CENTER);
        this.add(label, BorderLayout.SOUTH);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new JTreeDemo();
    }

    static class UserObject {
        String id;

        String data;

        public UserObject(String id, String data) {
            this.id = id;
            this.data = data;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

        public String getId() {
            return id;
        }

        public int hashCode() {
            final int PRIME = 31;
            int result = 1;
            result = PRIME * result + ((data == null) ? 0 : data.hashCode());
            result = PRIME * result + ((id == null) ? 0 : id.hashCode());
            return result;
        }

        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            final UserObject other = (UserObject) obj;
            if (data == null) {
                if (other.data != null)
                    return false;
            } else if (!data.equals(other.data))
                return false;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }

        public String toString() {
            return this.id + ": " + this.data;
        }
    }
}
```
Ich haette das so gemacht um die Darstellungslogik nicht zu sehr an die Anwendungslogik zu binden...

Gruss Tom


----------



## flashray (2. Mai 2006)

Danke Tom,

stimmt ein DefaultMutableTreeNode erwartet nicht unbedingt ein String sondern akzeptiert jedes Objekt. Dadurch kann man die Speicherung der ID eine Ebene tiefer nämlich im userObject selbst vornehmen.


Vg Erdal


----------



## Proggo (14. Dezember 2011)

Könnte man hier auch den XMLEncoder/Decoder implementieren? Ich bekomme dort  InstantiationException bzw. XMLEncoder: discarding statement XMLEncoder.writeObject(DefaultTreeModel);

Kann also den Baum nicht serialisieren.


----------



## Proggo (14. Dezember 2011)

Ich glaube das Problem kann ich umgehen. Kann mir Jemand erklären, wie ich die ID serialisieren kann per Encoder? Dazu benötigt man glaube Default Persitence Delegate oder? Wie setze ich das richig ein?

sry 4 Doppelpost!


----------



## Proggo (18. Dezember 2011)

Die Frage besteht immernoch. Wie serialisiere ich das erste oder zweite Beispiel per XMLEncoder inkl. ID? Weiß das Niemand?


----------

