# XML JTree änder sich nicht



## TJava (1. Feb 2011)

Also beim ersten ändern hat es geklappt, der JTree hat sich verändert.
Jetzt allerdings nicht mehr. Es gibt auch keine Fehlermeldung wenn die Datei nicht da ist.
Kann mir das jemand erklären wird es irgendwo zwischengespeichert?



```
package view;

import java.awt.BorderLayout;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class JXMLTree extends JFrame {

	private JTree tree;
	private JScrollPane scrollPane;

	public JXMLTree() {
		super("JXMLTreeTest");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		DefaultMutableTreeNode root = initTreeRoot("Hier steht die test.xml");
		tree = new JTree(root);
		scrollPane = new JScrollPane(tree);
		getContentPane().add(scrollPane, BorderLayout.CENTER);

		pack();
		setVisible(true);
	}

	private DefaultMutableTreeNode initTreeRoot(String file) {

		Document doc1 = null;
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder builder = factory.newDocumentBuilder();
			doc1 = builder.parse(this.getClass().getResourceAsStream(file));
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		if (doc1 == null)
			return new DefaultMutableTreeNode("EMPTY");

		Node rootNode = doc1.getFirstChild();
		DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootNode
				.getNodeName());
		treeWalk(rootNode, 0, root);

		return root;
	}

	public static void treeWalk(Node node, int level,
			DefaultMutableTreeNode parentNode) {

		String nodeName = node.getNodeName();
		DefaultMutableTreeNode childNode = null;

		if (node.hasChildNodes()) {
			level++;
			System.out.println(repeat(level, ' ').append(nodeName));
			NodeList list = node.getChildNodes();
			int len = list.getLength();
			for (int i = 0; i < len; i++) {
				Node child = list.item(i);
				childNode = new DefaultMutableTreeNode(child.getNodeName());
				parentNode.add(childNode);
				treeWalk(list.item(i), level, childNode);
			}
		} else {
			childNode = new DefaultMutableTreeNode(node.getNodeValue());
			System.out
					.println(repeat(level, ' ').append(node.getTextContent()));
			parentNode.add(childNode);
		}
	}

	public static void main(String[] args) {
		new JXMLTreeTest();
	}

	public final static StringBuffer repeat(int n, char c) {
		char[] cA = new char[n];
		Arrays.fill(cA, c);
		return (StringBuffer) new StringBuffer().insert(0, cA);
	}
}
```


----------



## TJava (2. Feb 2011)

Hat jemand eine antwort darauf? Die änderung funktioniert wenn ich in eclipse projects --> clean mache.
Aber auch wenn die Datei nicht angegeben wird zeigt er sie an.


```
DefaultMutableTreeNode root = initTreeRoot("test.xml");
```


----------



## SlaterB (2. Feb 2011)

die Datei wird wahrscheinlich vom Verzeichnis der .java-Quelldateien zu den .class-Dateien kopiert, liegen die getrennt vor?

das passiert bei jedem Clean, auch nach Quellcode-Änderungen, aber nicht unbedingt wenn du eine XML-Datei änderst, schon gar nicht wenn außerhalb von Eclipse so dass dieses davon nichts mitbekommt

in professionellen Programmen mit komplizierten Deploy-Vorgang ist das ganz ok so,
im einfachen Falle kannst du überlegen, die Datei unabhängig von den Klassen in einem extra-Verzeichnis abzulegen 
und dann 
new FileInputStream("/xml/test.xml");
zu verwenden


----------

