# Jtree + Attribute



## raffnix (28. Mai 2005)

Hallo ich lese folgende xml in einen Jtree ein:

```
<?xml version="1.0" encoding="UTF-8" ?> 
- <ANNOTATION>
- <SELECTION Name="gesture" DEFAULT="none">
  <ELEMENT>none</ELEMENT> 
  <ELEMENT>open</ELEMENT> 
  <ELEMENT>closed</ELEMENT> 
  <ELEMENT>fist</ELEMENT> 
  <ELEMENT>L</ELEMENT> 
  <ELEMENT>Victory</ELEMENT> 
  </SELECTION>
- <SLECTION NAME="side" DEFAULT="none">
  <ELEMENT>none</ELEMENT> 
  <ELEMENT>right hand</ELEMENT> 
  <ELEMENT>left Hand</ELEMENT> 
  </SLECTION>
- <SELECTION NAME="view" DEFAULT="none">
  <ELEMENT>none</ELEMENT> 
  <ELEMENT>palm</ELEMENT> 
  <ELEMENT>back</ELEMENT> 
  <ELEMENT>side</ELEMENT> 
  </SELECTION>
  </ANNOTATION>
```

der code zum einlesen:

```
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import java.util.Iterator;
import java.util.List;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import java.io.File;


public class XMLTreeViewer extends JFrame{
	private JTree baum;
	private Document xmlDoc;
	DefaultMutableTreeNode treenode;
	public XMLTreeViewer(Document doc){
		 super();
		 this.xmlDoc = doc;
		 setSize(600, 450);
         treenode = new DefaultMutableTreeNode("Annotation");
		 initialize();
	}

	private void initialize(){

		baum = new JTree();
		getContentPane().add(new JScrollPane(baum), BorderLayout.CENTER);
        processElement(xmlDoc.getRootElement(), treenode);
		((DefaultTreeModel)baum.getModel()).setRoot(treenode);
		addWindowListener(new java.awt.event.WindowAdapter(){
			      public void windowClosing(java.awt.event.WindowEvent e){					 
					  baum = null;
					  treenode = null;
				  }
			} );

		setVisible(true);
	}


	 private void processElement(Element elem, DefaultMutableTreeNode dmtn) {
		 
		 String text = elem.getTextNormalize();
		 DefaultMutableTreeNode currentNode =
		 	new DefaultMutableTreeNode(text);			
		 processAttributes(elem, currentNode);
		 Iterator children = elem.getChildren().iterator();
		 while(children.hasNext())
		 	processElement((Element)children.next(), currentNode);
		 dmtn.add(currentNode);
	 }

	public void processAttributes(Element elem, DefaultMutableTreeNode dmtn) {
		 Iterator atts = elem.getAttributes().iterator();

		 while(atts.hasNext()){
			 Attribute att = (Attribute) atts.next();
			 DefaultMutableTreeNode attNode =
			 	new DefaultMutableTreeNode(att.getValue());
			
		 }
	 }

	public static void main(String args[])
		throws Exception
	{
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(new File("Annotation.xml"));
		XMLTreeViewer viewer = new XMLTreeViewer(doc);
		viewer.addWindowListener(new java.awt.event.WindowAdapter(){
			      public void windowClosing(java.awt.event.WindowEvent e){
				  	System.exit(0);
				  }
			} );
	}
}
```

soweit klappt das ganz gut. bis auf einen punkt. 
ich möchte die Knoten  im Jtree mit dem entsprechenden Name Attribute   benamsen.(z.b gesture).
ist das möglich?


----------



## clemson (29. Mai 2005)

woran scheitert es denn? möglich is es jedenfalls.


----------



## raffnix (29. Mai 2005)

Hat sich erledigt.


----------



## Azmodan (6. Jun 2005)

Sicher mach deine eigene Klasse MyTreeNode und leite sie von DefaultMutableTreeNode ab. Dann überschreibst du die toString() Funktion und gibst dein Attribute zurück. Fertig!

Oops schon ein bißchen spät. Sorry.


----------



## dan-ger (11. Mrz 2007)

Hallo,

ich probiere seit letzter Nacht folgendes:

Ich habe mir aus meiner XML Datei -->

(Auszug ...)

```
<?xml version="1.0"?>
<Geometrie>
<Wuerfel>
<Wuerfel_1 Description="Groesse: 5x5cm - Farbe: Rot"></Wuerfel_1>
<Wuerfel_2 Description="Groesse: 7x7cm - Farbe: Blau"></Wuerfel_2>
</Wuerfel>
</Geometrie>
```


einen JTree anzeigen lassen. So weit so gut. Ich lasse mir den Baum auch nur bis Wuerfel_01. bzw Wuerfel_02 ausgeben. Die Ausgabe des Baumes sieht also wie folgt aus:


```
Geometrie (Ordner)
+ Wuerfel (Ordner)
- Wuerfel_01 (Blatt)
- Wuerfel_02 (Blatt)
```

Was ich jetzt gern haben möchte, ist das wenn der User in dem Baum auf Wuerfel_01 klickt, also auf das Blatt, mir die Description dieses Tags (also das Attribut) auf einem JLabel oder der gleichen ausgegeben wird.
Kan mir jemand in diesem Fall weiter helfen!? Ich bekomme das einfach hin.

Die Theorie verstehe ich soweit, nur ich bekomm es nicht umgesetzt *argh*.


Gruß


----------



## SlaterB (11. Mrz 2007)

geht's noch um XML oder allein um die Event-Verarbeitung?

ich behaupte mal das sind zwei völlig getrennte Bereiche, die nix in einem Thread zu suchen haben,
Daten aus XML holen ist unabhängig von der Art der weiteren Verarbeitung..,

so und was hast du nun an der Theorie schon verstanden?
oder ist das ein leerer Satz für 'keine Ahnung'? 

wie man JTrees benutzt, steht z.B. hier,
http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html

auch mit Beispiel-Code, in dem auf Anklicken reagiert wird,
TreeSelectionListener


----------



## Gast (27. Aug 2007)

Hallo,
eine kleine frage, warum geht das Programm nicht in die while schleife!? habe ausgaben gemacht wie ihr sehen könnt..schleifen anfang und ende..und daszwischen sollte auch noch eines ausagbe kommen, tuts aber nicht! wieso?

```
SAXBuilder sb = new SAXBuilder();
        doc = sb.build( "gesamt.xml" ); 
        Element used = doc.getRootElement(); 
        //Element link = used.getChild("link");
        List link = used.getChildren("link");
        Iterator linkIterator = link.iterator();
        System.out.println("......schleifen beginn");
            while (linkIterator.hasNext()){
            String id = used.getChild("id").getText();
            System.out.println("id: " + used.getChild("id").getText());
    }
        
        System.out.println("......schleifen ende");
```


----------

