JTree / problem / graphikfehler

  • Themenstarter Themenstarter Solour.
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

Solour.

Gast
hey,

ich habe da ein kleines problem mit mienem JTree, er macht halt so grafikfehler und zeigt nicht alle elemente an
n1.png

doppelklick auf machines
n2.png

doppelklick auf 1
n3.png

doppelklick auf 3
n4.png

doppelklick auf 0
n5.png

klick auf 1
n6.png

src1
src2

output:
1
3
0
1

laut debugger sind alle elemente vorhanden (inclusive der zwei nullen die an der 3 hängen müssten nach dem letzten klick)

falls jemand ne idee hat was ich falsch mache, bitte immer her damit...

bye

hier nochmal der code:
Code:
package main;

import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;

public class MainFrame extends JFrame {
	private static final long serialVersionUID = 9139820656652675733L;

	private JPanel lowerArea = new JPanel();
	private DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode(
			"Machines");
	private JTree tree = new JTree(treeRoot);

	public MainFrame() {
		initComponents();
	}

	private void initComponents() {
		this.getContentPane().add(lowerArea);
		lowerArea.setLayout(new GridLayout(1, 0, 10, 10));
		lowerArea.add(tree);
		this.setBounds(100, 100, 200, 200);
		DefaultMutableTreeNode prev = treeRoot;
		Integer a1 = new Integer(1);
		Integer a2 = new Integer(2);
		Integer a3 = new Integer(3);
		DefaultMutableTreeNode tn1 = new DefaultMutableTreeNode();
		DefaultMutableTreeNode tn2 = new DefaultMutableTreeNode();
		DefaultMutableTreeNode tn3 = new DefaultMutableTreeNode();
		tn1.setUserObject(a1);
		tn2.setUserObject(a2);
		tn3.setUserObject(a3);
		prev.add(tn1);		
		tn1.add(tn3);
		prev.add(tn2);		

		ToolTipManager.sharedInstance().registerComponent(tree);
		tree.setRootVisible(true);
		tree.addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent evt) {
				tree_valueChanged(evt);
			}
		});
	}

	private void tree_valueChanged(TreeSelectionEvent evt) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
				.getLastSelectedPathComponent();
		if (node == null)
			return;
		if (node.getUserObject().getClass().equals(Integer.class)) {
			System.out.println(node.getUserObject());
			DefaultMutableTreeNode tn = new DefaultMutableTreeNode();
			tn.setUserObject(new Integer(0));
			node.add(tn);
		}
	}
}
 
und wo ist jetzt der darstellungsfehler? der code verhält sich doch korrekt: die unterknoten werden erst einem knoten angehängt, wenn man auf ihn klickt, darum werden bei manchen auch keine ordner sondenr knöppe darsgestellt, weil sie zu dem zeitpunkt noch keine unterknoten haben. war das dein problem oder was nu?
 
habe zwar leider keine erklärung aber jetzt geht es hiermit, falls also jemand ne erklärung hat 😛
Code:
package main;

import java.awt.GridLayout;

import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class MainFrame extends JFrame {
	private static final long serialVersionUID = 9139820656652675733L;

	private JPanel lowerArea = new JPanel();
	private DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode(
			"Machines");
	private JTree tree = new JTree(treeRoot);
	private DefaultTreeModel tm= new DefaultTreeModel(treeRoot);

	public MainFrame() {
		initComponents();
	}

	private void initComponents() {
		this.getContentPane().add(lowerArea);
		lowerArea.setLayout(new GridLayout(1, 0, 10, 10));
		lowerArea.add(tree);
		this.setBounds(100, 100, 200, 200);
		DefaultMutableTreeNode prev = treeRoot;
		Integer a1 = new Integer(1);
		Integer a2 = new Integer(2);
		Integer a3 = new Integer(3);
		DefaultMutableTreeNode tn1 = new DefaultMutableTreeNode();
		DefaultMutableTreeNode tn2 = new DefaultMutableTreeNode();
		DefaultMutableTreeNode tn3 = new DefaultMutableTreeNode();
		tn1.setUserObject(a1);
		tn2.setUserObject(a2);
		tn3.setUserObject(a3);
		prev.add(tn1);
		tn1.add(tn3);
		prev.add(tn2);

		ToolTipManager.sharedInstance().registerComponent(tree);
		tree.setRootVisible(true);
		tree.addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent evt) {
				tree_valueChanged(evt);
			}
		});
	}

	private void tree_valueChanged(TreeSelectionEvent evt) {
		DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree
				.getLastSelectedPathComponent();
		if (node == null)
			return;
		if (node.getUserObject().getClass().equals(Integer.class)) {
			DefaultMutableTreeNode tn = new DefaultMutableTreeNode();
			tn.setUserObject(new Integer(0));
			node.add(tn);
			tm.nodeStructureChanged(node.getParent());
			System.out.println(node.getUserObject()+" / "+node.getChildCount());			
			tree.setModel(tm);
		}
	}
}
 
hübscher ist es natürlich so,
so muss man sich nicht ums expanden danach kümmern

hierbei wird die newNode an die node rangehangen
Code:
((DefaultTreeModel) tree.getModel())
.insertNodeInto(newNode, node, node.getChildCount());
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben