# Baumstruktur erstellen und Art Tabelle festhalten!?



## fl_ex (16. Nov 2010)

Moin Jungs,

ich benötige von jemandem mal einen kleinen Anstoß bzw. ne Idee, wie ich folgendes Umsetzen könnte...

Also ich möchte Gruppen erstellen, d.h Obergruppen, die dann wieder untergruppen haben und die dann wieder welche haben... und ganz unten sind dann Systeme... Diese Systeme können sich in mehreren Gruppen vorfinden lassen... sollte dann später in etwa so aussehen:

*-Hauptgruppe 1 
  - Untergruppe 1
     - System XYZ
     - System XYZ2
  - Untergruppe 2
     - System XYZ

-Hauptgruppe 2
......*

Des weiteren sollen Systeme eingetragen werden können vom Nutzer.... 

Für n kleinen Anstoß wär ich dankbar! 


Grüße,
fl_ex


----------



## Landei (16. Nov 2010)

```
public class Hauptgruppe {
   public List<Untergruppe> list = new ArrayList<Untergruppe>();
   //und Getter und Setter und Kringelchen und Schleifchen
}

public class Untergruppe {
   public List<System> list = new ArrayList<System>();
   //und Getter und Setter und Kringelchen und Schleifchen
}

//diese Klasse sollte man umbenennen 
//wegens Namens-Clash mit java.lang.System
public class System { 
}
```


----------



## fl_ex (16. Nov 2010)

Also haben die Beans gebaut so... Hauptgruppenklasse, Untergruppenklasse... und erstelle in der Hauptgruppe jetz eine Untergruppe... Wie bau ich da die Beziehungen untereinander auf bzw. bilde es dann später in einem Baum ab? ..... *schäm* ^^.... beginner

simples Beispiel würde reichen denk ich^^


----------



## fl_ex (16. Nov 2010)

hatte eventuell auch gedacht er erstmal in einem Tree auszugeben so... das dann in eine Datei zu speichern und später wieder abrufen lassen kann... 

Hauptgruppe (name,beschreibung)
Untergruppe (name, beschreibung)
System (name, beschreibung)

...^^

EDIT:
____

*einen Baum erstellen klappt soweit alles... wie speicher ich diese Struktur in eine Datei, damit cih sie später wieder abrufen kann?... Denke dann wäre mein Problem gelöst =)*


----------



## nwinkler (16. Nov 2010)

fl_ex hat gesagt.:


> Moin Jungs,
> 
> ich benötige von jemandem mal einen kleinen Anstoß bzw. ne Idee, wie ich folgendes Umsetzen könnte...
> 
> ...



Ich weiß nicht, ob das die Frage ist: Baumstrukturen in Datenbanktabellen abbilden.
Falls, dann kannst Du mal nach Nested Set suchen.


----------



## fl_ex (16. Nov 2010)

Also mein Ziel, bzw. Aufgabe ist es:

Eine Applikation erstellen, wo man sich: 

- Hauptgruppen erstellen kann 
- Untergruppen zu den jeweiligen Hauptgruppen erstellen kann
- Und dadrunter wieder Gruppen erstellen kann

...es sollen immer Ggruppen hinzugefügt bzw gelöscht werden können.
Anzeige als Baumstruktur hatte ich gedacht...

Würde gerne um eine Datenbank drumherum kommen... ne textdatei oder xml oder sonstwas(kA davon) wär mir lieber...^^


----------



## dku (17. Nov 2010)

Hi fl_ex,

wenn du sonst keine Datenbank benötigst, versuch es in einer XML Datei abzubilden. 
Ansonsten wäre das Stichwort nested Sets, wie nwinkler es schon sagte ;-)

Viele Grüße,
David


----------



## fl_ex (17. Nov 2010)

Habe es nun anders gemacht... Hab mir nun einen Tree erstellt...
Kann dort jetz einträge machen und wieder entfernen etc. und er gibt mir auch mit ner funktion den pfad aus, also wie die verschachtelt sind...
Das Problem ist jetzt nur, wie krieg ich die Struktur die ich da "Live" erstellen kann gespeichert?...
gibt es da nicht einen Befehl der sagst tree.getStructure() oder sowas? :/

Hier der Quellcode:

```
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import util.StartTree;
import util.pathMethod;
import util.pathMethodSaveInFile;

public class TreeProgram extends JFrame {

	private JPanel contentPane;
	private JTextField txtEingabeEinesSystems;

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

	/**
	 * Create the frame.
	 */
	public TreeProgram() {
		setResizable(false);
		setTitle("Bebauungsplan in K-SIE-4");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 600, 483);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);

		final DefaultTreeModel model;

		final JButton btnUnterpunktAnlegen = new JButton("Unterpunkt anlegen");

		final JButton btnLokalisieren = new JButton("Lokalisieren");

		final JButton btnSysAnlegen = new JButton("System anlegen");

		final JButton btnEditieren = new JButton("Editieren");

		final JButton btnLoeschen = new JButton("Loeschen");

		final JButton btnSuchen = new JButton("Suchen");

		final JButton btnSpeichern = new JButton("Speichern");

		final JButton btnSchliessen = new JButton("Schliessen");

		txtEingabeEinesSystems = new JTextField();
		txtEingabeEinesSystems.setText("...");
		txtEingabeEinesSystems.setColumns(10);

		// Tree konfig
		final StartTree startTree = new StartTree();
		TreeNode root = startTree.makeSampleTree();
		model = new DefaultTreeModel(root);
		final JTree tree = new JTree(model);

		// **************************
		// SCHLIESSEN -!!-
		// **************************
		ActionListener back = new ActionListener() {
			public void actionPerformed(ActionEvent actionEvent) {

				// ***********
				// ZURÜCK -!!-
				// ***********
				setVisible(false);
				final MainFRM mainFRM = new MainFRM();
				mainFRM.setVisible(true);
				mainFRM.setLocationRelativeTo(null);

			};
		};

		// **************************
		// LÖSCHEN -!!-
		// **************************
		ActionListener delete = new ActionListener() {
			public void actionPerformed(ActionEvent event) {

				try {

					DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
							.getLastSelectedPathComponent();
					if (event.getSource().equals(btnLoeschen)) {
						if (selectedNode.getParent() != null)
							model.removeNodeFromParent(selectedNode);
						return;
					}
				} catch (Exception e) {
					JOptionPane.showConfirmDialog(null, "Nichts selektiert!",
							"Löschen nicht möglich!", JOptionPane.DEFAULT_OPTION);
				}
			};
		};

		// **************************
		// LOKALISIEREN-!!-
		// **************************
		ActionListener path = new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();
				if (event.getSource().equals(btnLokalisieren)) {

					TreePath path = tree.getSelectionPath();

					final pathMethod pathMethod = new pathMethod();
					pathMethod.ausgabe(path);

					if (selectedNode.getParent() != null)
						// JOptionPane.showConfirmDialog((Component) null, "" +
						// tree.getSelectionPath(),
						// "Pfadangabe", JOptionPane.DEFAULT_OPTION);
						return;
				}
			};
		};

		// **************************
		// SPEICHERN*(Baum) -!!-
		// **************************
		ActionListener save = new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();
				if (event.getSource().equals(btnSpeichern)) {

					TreePath path = tree.getSelectionPath();
					System.out.println(tree.getSelectionPath());

					final pathMethodSaveInFile pathMethodSaveInFile = new pathMethodSaveInFile();
					try {
						pathMethodSaveInFile.ausgabe(path);
						System.out.println("fertig");
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					}

					if (selectedNode.getParent() != null)
						// JOptionPane.showConfirmDialog((Component) null, "" +
						// tree.getSelectionPath(),
						// "Pfadangabe", JOptionPane.DEFAULT_OPTION);
						return;
				}
			};
		};

		// **************************
		// EDITIEREN -!!-
		// **************************
		ActionListener edit = new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
						.getLastSelectedPathComponent();

				if (event.getSource().equals(btnEditieren)) {
					String renamePunkt = JOptionPane.showInputDialog("Umbenennen in...");
					DefaultMutableTreeNode renameNode = new DefaultMutableTreeNode(renamePunkt);

					DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode
							.getParent();

					if (parent != null) {
						int selectedIndex = parent.getIndex(selectedNode);
						model.removeNodeFromParent(selectedNode);
						model.insertNodeInto(renameNode, parent, selectedIndex);
					}
					return;
				}
			};
		};

		// **************************
		// SYSTEM HINZUFÜGEN -!!-
		// **************************
		ActionListener addSys = new ActionListener() {
			public void actionPerformed(ActionEvent event) {

				try {
					String name = JOptionPane.showInputDialog("Bitte Namen eingeben...");
					// String beschreibung =
					// JOptionPane.showInputDialog("Beschreibung eingeben...");

					if ((name != null) || (name == "")) {

						DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
								.getLastSelectedPathComponent();

						DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(name);

						if (event.getSource().equals(btnSysAnlegen)) {
							DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode
									.getParent();

							if (parent != null) {
								int selectedIndex = parent.getIndex(selectedNode);
								model.insertNodeInto(newNode, parent, selectedIndex + 1);
							}
						}

						if (event.getSource().equals(btnUnterpunktAnlegen)) {

							model.insertNodeInto(newNode, selectedNode,
									selectedNode.getChildCount());
						}

						// ******************
						// AKTUALISIEREN -!!-
						// ******************
						TreeNode[] nodes = model.getPathToRoot(newNode);
						TreePath path = new TreePath(nodes);
						tree.scrollPathToVisible(path);

						// **************************
						// SYSTEMICON SETZEN!
						//
						// FUNZT NOCH NICHT -!!-
						// **************************

						final ImageIcon icon = new ImageIcon("Y:/iconsmall.jpg");
						DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
						renderer.setLeafIcon(icon);
						tree.setCellRenderer(renderer);

					}

				} catch (NullPointerException e) {
					JOptionPane.showConfirmDialog(null, "Keine Bezeichnung eingegeben",
							"Hinzufügen fehlgeschlagen!", JOptionPane.DEFAULT_OPTION);
				}
			}
		};

		// **************************
		// UNTERPUNKT HINZUFÜGEN -!!-
		// **************************
		ActionListener addFolder = new ActionListener() {
			public void actionPerformed(ActionEvent event) {

				try {
					String name = JOptionPane.showInputDialog("Bitte Namen eingeben...");
					// String beschreibung =
					// JOptionPane.showInputDialog("Beschreibung eingeben...");

					if ((name != null) || (name == "")) {

						DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
								.getLastSelectedPathComponent();

						DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(name);

						if (event.getSource().equals(btnUnterpunktAnlegen)) {

							model.insertNodeInto(newNode, selectedNode,
									selectedNode.getChildCount());
						}

						// ******************
						// AKTUALISIEREN -!!-
						// ******************
						TreeNode[] nodes = model.getPathToRoot(newNode);
						TreePath path = new TreePath(nodes);
						tree.scrollPathToVisible(path);

					}
				} catch (NullPointerException e) {
					JOptionPane.showConfirmDialog(null, "Keine Bezeichnung eingegeben",
							"Hinzufügen fehlgeschlagen!", JOptionPane.DEFAULT_OPTION);
				}
			};
		};

		btnEditieren.addActionListener(edit);
		btnLoeschen.addActionListener(delete);
		btnLokalisieren.addActionListener(path);
		btnSysAnlegen.addActionListener(addSys);
		btnUnterpunktAnlegen.addActionListener(addFolder);
		btnSpeichern.addActionListener(save);
		btnSchliessen.addActionListener(back);

		JButton btnDetails = new JButton("Details");

		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane
				.setHorizontalGroup(gl_contentPane
						.createParallelGroup(Alignment.LEADING)
						.addGroup(
								gl_contentPane
										.createSequentialGroup()
										.addGroup(
												gl_contentPane
														.createParallelGroup(Alignment.LEADING)
														.addComponent(tree,
																GroupLayout.PREFERRED_SIZE, 433,
																GroupLayout.PREFERRED_SIZE)
														.addComponent(btnDetails))
										.addPreferredGap(ComponentPlacement.UNRELATED)
										.addGroup(
												gl_contentPane
														.createParallelGroup(Alignment.TRAILING)
														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addGroup(
																				gl_contentPane
																						.createParallelGroup(
																								Alignment.LEADING)
																						.addComponent(
																								btnSchliessen,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnSpeichern,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnUnterpunktAnlegen,
																								GroupLayout.PREFERRED_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnEditieren,
																								Alignment.TRAILING,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnSysAnlegen,
																								Alignment.TRAILING,
																								GroupLayout.PREFERRED_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnLoeschen,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								btnSuchen,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE)
																						.addComponent(
																								txtEingabeEinesSystems,
																								GroupLayout.DEFAULT_SIZE,
																								133,
																								Short.MAX_VALUE))
																		.addGap(6))
														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addComponent(
																				btnLokalisieren)
																		.addGap(29)))));
		gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(
						Alignment.TRAILING,
						gl_contentPane
								.createSequentialGroup()
								.addGroup(
										gl_contentPane
												.createParallelGroup(Alignment.TRAILING)
												.addComponent(tree, Alignment.LEADING,
														GroupLayout.DEFAULT_SIZE, 409,
														Short.MAX_VALUE)
												.addGroup(
														gl_contentPane
																.createSequentialGroup()
																.addComponent(btnUnterpunktAnlegen)
																.addPreferredGap(
																		ComponentPlacement.RELATED)
																.addComponent(btnSysAnlegen)
																.addPreferredGap(
																		ComponentPlacement.RELATED)
																.addComponent(btnEditieren)
																.addPreferredGap(
																		ComponentPlacement.RELATED)
																.addComponent(btnLoeschen)
																.addGap(20)
																.addComponent(
																		txtEingabeEinesSystems,
																		GroupLayout.PREFERRED_SIZE,
																		GroupLayout.DEFAULT_SIZE,
																		GroupLayout.PREFERRED_SIZE)
																.addPreferredGap(
																		ComponentPlacement.RELATED)
																.addComponent(btnSuchen)
																.addPreferredGap(
																		ComponentPlacement.RELATED)
																.addComponent(btnLokalisieren)
																.addPreferredGap(
																		ComponentPlacement.RELATED,
																		176, Short.MAX_VALUE)
																.addComponent(btnSpeichern)))
								.addPreferredGap(ComponentPlacement.RELATED)
								.addGroup(
										gl_contentPane
												.createParallelGroup(Alignment.BASELINE)
												.addComponent(btnSchliessen,
														GroupLayout.PREFERRED_SIZE, 30,
														GroupLayout.PREFERRED_SIZE)
												.addComponent(btnDetails))));
		contentPane.setLayout(gl_contentPane);
	}
}
```


----------



## dku (17. Nov 2010)

könntest das TreeModel auch einfach serialisieren, wenn's dir einfach nur um das Speichern auf der Festplatte geht.

Bitte aber den Hinweis im JavaDoc vom DefaultTreeModel zum Thema serialisieren beachten.

Viele Grüße,
David


----------



## fl_ex (17. Nov 2010)

inwiefern "einfach serialisieren" ?....
bin noch eher ein Neuling


----------



## dku (17. Nov 2010)

Schau mal hier ;-)

Java ist auch eine Insel – 12.14 Persistente Objekte und Serialisierung

Das Buch ist für den Einstieg eh zu empfehlen, gibt einen ganz guten Überblick für den Einstieg in die Materie Java.


----------



## fl_ex (17. Nov 2010)

Hast du das jetzt nur geschrieben? Oder auch vorher meinen Quellcode angeschaut?^^ 
Da steht das es nur für Beans funktioniert... Und das hab ich ja nicht wirklich so... :/


----------



## dku (17. Nov 2010)

Ein bisschen weiterlesen, bis zum Punkt  "Die Schnittstelle Serializable" 

Habe deinen Quellcode nicht im ganzen gelesen, aber da ich das DefaulTreeModel entdeckt habe, bin ich davon ausgegangen, dass du es auch benutzt ;-)

Und dieses implementiert das Interface Serializable


----------



## fl_ex (18. Nov 2010)

okay habs hinbekommen ... 

einfach serialisiert:

```
public class Serializer {

	public void serialize(final JTree tree) {
		try {
			XMLEncoder o = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(
					"Y:/testFile.xml")));
			o.writeObject(tree.getModel());
			o.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```


und wieder deserialisert:

```
private DefaultTreeModel deSerialize() {
		XMLDecoder d = null;
		Object result = null;
		try {
			d = new XMLDecoder(new BufferedInputStream(new FileInputStream("Y:/testFile.xml")));
			result = d.readObject();
			d.close();
		} catch (FileNotFoundException ex) {
			JOptionPane.showMessageDialog(null, "Datei nicht gefunden");
		}
		return (DefaultTreeModel) result;
	}
```

DANKE AN ALLE =)


----------

