# JTree dynamisch aufbauen



## BlackScorp21 (22. Jan 2008)

Hi Leute! Ich habe ein Problem mit einem JTree.
Will diesen nach einer Datenbankabfrage mit Ergebnissen füllen.
Also muss er Dynamisch erstellt werden.

Was ich nutze:
Int c1, c2, c3 = 0; 	//Jeweils die Startwerte der Arrays
String countClass, StringCountABC		//Strings die das Aktuelle Zeichen zum vergleichen tragen.
arrDiffClass[] = {1,2,3,4}
arrDiffABC{} = {a,b,c}
arrNamen[] etc. sind nur die Werte des ResultSets alles Schüler 
arrClass[] = stehen die passenden Klassen zu den Namen als 1,2,3,4
arrABC[] = stehen die passenden Bezeichnungen zu den Namen also a,b,c
Wenn man also die letzten drei an der gleichen Position abfragt bekommt man 
„Musterman, 1,a“
Es wurde nach klasse, abc vorsortiert: Also 1a,1b,1c,2a,2b,2c,3a,3b,3c,4a,4b,4c


```
private DefaultMutableTreeNode createPupilTree()
	{	//Tree Root
		treeRoot = new DefaultMutableTreeNode( "Übersicht der Schüler" );
		String countClass;
		String countABC;
		c1 = 0;
		c2 = 0;
		c3 = 0;
		
		//Solange bis der Klassen durchlaufen wurde
		while(c1 < lengthArrDiffClasses)
		{	
			countClass = arrClass[c1];
			System.out.println("CountClaas = "+countClass);
			treeClass = new DefaultMutableTreeNode(arrClass[c1]);
			while(c2 <lengthArrDiffAbc)
			{	countABC = arrABC[c2];
				System.out.println("CountABC = "+countABC);
				treeABC = new DefaultMutableTreeNode(arrABC[c2]);
				while (c3 < lengthArrNames && countClass.equals(arrClass[c3])
						&& countABC.equals(arrABC[c3]))
				{	treePupil = new DefaultMutableTreeNode(""+arrName[c3]+", "+arrFirstName[c3]+" "+arrClass[c3]+arrABC[c3]);	
					treeABC.add(treePupil);
					c3++;
				}
				treeClass.add(treeABC);
				c2++;
			}
			
			treeRoot.add(treeClass);
			c1++;
		}
		return treeRoot;
	}
```

Sollte also im Endefekt ungefähr so aussehen:

Root
---Klasse1
--------a
--------------Mustermann,1,a
--------------Müller,1,a
--------b
--------------Meier,1,b
--------------Schulze,1,b
--------c
---Klasse2
--------a
--------b
--------c
---Klasse3
--------a

Bei mir zählt er aber die Variablen nicht wirklich hoch! Verstehe nicht warum!
Deshalb gibt er bei mir nur den ersten Pfad aus. Also alles was mit Klasse 1a zusammenhängt.

Kann jmd helfen?


----------



## Niki (22. Jan 2008)

Ich würde das ganze so machen, schaut zwar recht komplex aus, funktioniert aber (ist sogar getestet, den Baum musst du dir aber selber aufbauen, sollte aber nicht mehr das Problem sein):

```
public Map<String, Map<String, List<Schueler>>> listPupils(Connection con)
			throws Exception {
		Map<String, Map<String, List<Schueler>>> erg = new LinkedHashMap<String, Map<String, List<Schueler>>>();

		Statement stmt = con.createStatement();
		ResultSet rs = stmt
				.executeQuery("select vorname, zuname, klasse, abc from schueler order by klasse, abc, zuname, vorname");
		try {
			while (rs.next()) {
				String klasse = rs.getString("klasse");
				String abc = rs.getString("abc");
				String vorname = rs.getString("vorname");
				String zuname = rs.getString("zuname");

				Schueler schueler = new Schueler();
				schueler.setVorname(vorname);
				schueler.setZuname(zuname);

				Map<String, List<Schueler>> klassenListe = erg.get(klasse);
				List<Schueler> l = null;
				if (klassenListe == null) {
					klassenListe = new LinkedHashMap<String, List<Schueler>>();
					l = new ArrayList<Schueler>();
					klassenListe.put(abc, l);
					erg.put(klasse, klassenListe);
				} else {
					l = klassenListe.get(abc);
					if (l == null) {
						l = new ArrayList<Schueler>();
						klassenListe.put(abc, l);
					}
				}

				l.add(schueler);

			}
		} finally {
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
		}

		return erg;

	}
	
	public static void main(String[] args) throws Exception{
		Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
		Connection con = DriverManager.getConnection("jdbc:derby:.....");
		Map<String, Map<String, List<Schueler>>> map = new DBHelper().listPupils(con);
		for(Entry<String, Map<String, List<Schueler>>> e : map.entrySet()){
			System.out.println(e.getKey());
			for(Entry<String, List<Schueler>> e2 : e.getValue().entrySet()){
				System.out.println("\t" + e2.getKey());
				for(Schueler s : e2.getValue()){
					System.out.println("\t\t" + s.getZuname() + " " + s.getVorname());
				}
			}
			
		}
		
		
		con.close();
	}
}

class Schueler {
	private String vorname = null;
	private String zuname = null;

	public String getVorname() {
		return vorname;
	}

	public void setVorname(String vorname) {
		this.vorname = vorname;
	}

	public String getZuname() {
		return zuname;
	}

	public void setZuname(String zuname) {
		this.zuname = zuname;
	}
}
```


----------



## BlackScorp21 (22. Jan 2008)

schonmal Besten Dank. Gucke mir das heute Abend mal in ruhe an!
MFg BlackScorp21


----------



## Niki (22. Jan 2008)

Hier noch der Aufbau des Trees:


```
private JTree tree = null;
	private DefaultTreeModel model = null;
	
	private DefaultMutableTreeNode root = null;
	
	public JFAnzeige(Map<String, Map<String, List<Schueler>>> map) {
		super("Schueler Liste");
		guiInit();
		pack();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		
		buildTree(map);
	}

	private void guiInit() {
		Insets i = new Insets(3, 3, 3, 3);
		GridBagConstraints c = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
				GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, i, 0, 0);
		JComponent cont = (JComponent) getContentPane();
		cont.setLayout(new GridBagLayout());

		root = new DefaultMutableTreeNode("Root");
		model = new DefaultTreeModel(root);
		tree = new JTree(model);
		JScrollPane scroller = new JScrollPane();
		scroller.getViewport().add(tree);

		c.weightx = 1.0;
		c.weighty = 1.0;
		c.fill = GridBagConstraints.BOTH;
		cont.add(scroller, c);

	
	}
	
	private void buildTree(Map<String, Map<String, List<Schueler>>> map){
		for (Entry<String, Map<String, List<Schueler>>> e : map.entrySet()) {
			DefaultMutableTreeNode klasseNode = new DefaultMutableTreeNode(e.getKey());
			model.insertNodeInto(klasseNode, root, root.getChildCount());
			for (Entry<String, List<Schueler>> e2 : e.getValue().entrySet()) {
				DefaultMutableTreeNode abcNode = new DefaultMutableTreeNode(e2.getKey());
				model.insertNodeInto(abcNode, klasseNode, klasseNode.getChildCount());				
				for (Schueler s : e2.getValue()) {
					DefaultMutableTreeNode schuelerNode = new DefaultMutableTreeNode(s.getZuname() + " "
							+ s.getVorname());
					model.insertNodeInto(schuelerNode, abcNode, abcNode.getChildCount());		
					
				}
			}

		}
	}
```


----------

