JTree - Node mit ID versehen und auslesen

B

ByeBye 31659

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
 
Hallo,

schau mal hier:

Java:
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
 
Danke nun hab ich es :)

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

Code:
(DefaultMutableTreeNodewithID)tree.getLastSelectedPathComponent()).getNodeID());
 
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
 
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
 
Hallo!

Java:
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
 
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
 
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.
 
Zuletzt bearbeitet:
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!
 
Die Frage besteht immernoch. Wie serialisiere ich das erste oder zweite Beispiel per XMLEncoder inkl. ID? Weiß das Niemand?
 

Neue Beiträge

Zurück