# XML erzeugen aus JTree und wieder einlesen...



## fl_ex (17. Nov 2010)

Mooin,

ich bin am Ende mittlerweile im Inet nix zu finden....
Ich möchte aus einem JTree, der mit Buttons etc. erweitert werden kann, eine XML-Datei abspeichern damit die Nodes, die ich hinzugefügt habe beim nächsten Programmstart wieder geladen werden können, weil sonst lädt er immer nur die "Anfangskonfig."

Mein Code:


```
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class BebauungsplanTree {

}

class BebauungsplanTreeFrame extends JFrame implements ActionListener {
	public BebauungsplanTreeFrame() {
		setTitle("Bebauungsplan in K-SIE-4");
		setSize(450, 300);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

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

		Container contentPane = getContentPane();
		JScrollPane scrollPane = new JScrollPane(tree);
		contentPane.add(scrollPane, "Center");

		// Panel und Buttons hinzufügen
		JPanel panel = new JPanel();
		nachbarpunktBtn = new JButton("add Nachbarpunkt");
		nachbarpunktBtn.addActionListener(this);
		panel.add(nachbarpunktBtn);
		unterpunktBtn = new JButton("add Unterpunkt ");
		unterpunktBtn.addActionListener(this);
		panel.add(unterpunktBtn);
		deleteButton = new JButton("Delete");
		deleteButton.addActionListener(this);
		panel.add(deleteButton);
		pathButton = new JButton("Ort");
		pathButton.addActionListener(this);
		panel.add(pathButton);
		editButton = new JButton("Edit");
		editButton.addActionListener(this);
		panel.add(editButton);

		// noch nicht implementiert!

		saveButton = new JButton("Save");
		saveButton.addActionListener(this);
		panel.add(saveButton);

		contentPane.add(panel, "South");
	}

	public void actionPerformed(ActionEvent event) {
		DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
				.getLastSelectedPathComponent();

		System.out.println(tree.getSelectionPath());

		if (selectedNode == null)
			return;

		// Markiertes Element löschen
		if (event.getSource().equals(deleteButton)) {
			if (selectedNode.getParent() != null)
				model.removeNodeFromParent(selectedNode);
			return;
		}

		// Pfadausgabe des zuletzt benutzten Objekts
		if (event.getSource().equals(pathButton)) {
			if (selectedNode.getParent() != null)
				JOptionPane.showConfirmDialog((Component) null, "" + tree.getSelectionPath(),
						"Pfadangabe", JOptionPane.DEFAULT_OPTION);
			return;
		}

		// SEARCH
		System.out.println(tree.getModel().getRoot());

		// Save des Trees!
		if (event.getSource().equals(saveButton)) {

			System.out.println(tree.getModel().getRoot());

			if (selectedNode.getParent() != null) {

				FileWriter writer = null;

				File file = new File("test.txt");
				try {
					writer = new FileWriter(file, true);
					writer.write(String.valueOf(tree));
					writer.flush();
				} catch (final IOException e) {
					e.printStackTrace();
				}

			}
			return;
		}

		// Umbenennen
		if (event.getSource().equals(editButton)) {
			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;
		}

		// Unterpunkte hinzufügen
		String newPunkt = JOptionPane.showInputDialog("Bitte Namen eingeben...");
		DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(newPunkt);

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

			if (parent != null) {
				int selectedIndex = parent.getIndex(selectedNode);
				model.insertNodeInto(newNode, parent, selectedIndex + 1);
			}
		} else if (event.getSource().equals(unterpunktBtn)) {
			model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
		}

		// now display new node
		TreeNode[] nodes = model.getPathToRoot(newNode);
		TreePath path = new TreePath(nodes);
		tree.scrollPathToVisible(path);
	}

	private DefaultTreeModel model;

	private JTree tree;
	private JButton nachbarpunktBtn;
	private JButton unterpunktBtn;
	private JButton deleteButton;
	private JButton pathButton;
	private JButton editButton;

	// noch nicht implementiert
	private JButton saveButton;
}
```

Wäre für jede Hilfe dankbar... Auch wenn ihr jetzt Anmerkungen habt zum Programm immer posten verbesserungen etc. würden mich auch freuen... am wichtigsten aber die XML-Sache ^^

 

Grüße
fl_ex


----------



## fl_ex (17. Nov 2010)

:rtfm: ... keiner ne Idee?


----------



## DerEisteeTrinker (18. Nov 2010)

einfach bei JTree getTreeModel und das Teil dann abklappern und einzeln in die Tags umsetzen. Da kannst den XMLWriter nehmen


----------



## fl_ex (18. Nov 2010)

Wie meinst das mit einzelnt in die Tags umsetzen...?^^ Schaue mir mal den XMLWriter an


----------



## 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 trotzdem =)


----------



## fl_ex (18. Nov 2010)

von einem Problem ins nächste...^^

Also habe einen Speichern und einen Laden Button...
Wenn ich jetzt eine Struktur baue speichert er die XML ab und man kann sie auch mit iexplorer ansehen und sich durchklickern...
Wenn ich das programm nun neu starte und auf laden klicken wird die struktur geladen wie ich sie abgespeichert habe... so weit so gut...

Jetzt kann ich aber keine Button mehr benutzen?! Löschen,Editieren!? unterpunkte anlegen geht immernoch^^
Muss da noch was zusätzlich gemacht werden? 

Laden Button:

```
// **********
		// LADEN -!!-
		// **********

		JButton btnLaden = new JButton("LADEN");
		btnLaden.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

				DefaultTreeModel modelSave = (DefaultTreeModel) tree.getModel();
				modelSave = deSerialize();
				tree.setModel(modelSave);

			}
		});
```

Speichern button:

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

					final Serializer serializer = new Serializer();
					serializer.serialize(tree);

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

.... von einem Problem ins nächste.. immer wieder^^ vllt kann mir ja jemand helfen


----------



## DerEisteeTrinker (18. Nov 2010)

Was heißt geht nicht? Exception? Passiert nichts? Fällt in China ein Sack Reis um?

Einfach mal ganz simpel den Debugger anwerfen und dann schauen wo was nicht hinhaut.


----------

