JTree entfernt Nodes nicht

guni

Bekanntes Mitglied
Hallo,

versuche mich gerade im Schreiben eines eigenen TreeModels.
Alles funktioniert soweit, nur dass beim Entfernen von Nodes die Anzeige nicht aktualisiert wird.

Hier meine Nodes:

Java:
package com.guni;

import java.util.Vector;

public class Marker {
	private static final long serialVersionUID = 1L;
	private String heading;
	private Marker parent;
	private Vector<Marker> children;
	
	public Marker(String heading) {
		super();
		this.heading = heading;
		this.parent = null;
		this.children = new Vector<Marker>();
	}
	
	public void setHeading(String heading) {
		this.heading = heading;
	}
	
	public String getHeading() {
		return this.heading;
	}
	
	public void setParent(Marker m) {
		this.parent = m;
	}
	
	public Marker getParent() {
		return this.parent;
	}
	
	public void add(Marker m) {
		m.parent = this;
		this.children.add(m);
	}
	
	public void add(int index, Marker m) {
		m.parent = this;
		this.children.add(index, m);
	}
	
	public void remove(Marker m) {
		this.children.remove(m);
	}
	
	public void remove(int index) {
		this.children.remove(index);
	}
	
	public Marker get(int index) {
		return this.children.get(index);
	}
	
	public int countChildren() {
		return this.children.size();
	}
	
	public boolean isLeaf() {
		return countChildren() == 0;
	}
	
	public void dump() {
		for (int i=0; i<countChildren(); i++) {
			Marker child = children.get(i);
			System.out.println(child);
			child.dump();
		}
	}
	
	public String toString() {
		return this.heading;
	}
}

So sieht mein Model aus:
Java:
package com.guni;

import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class MarkerTreeModel implements TreeModel {
	private Marker root;

	public MarkerTreeModel(Marker root) {
		this.root = root;
	}

	@Override
	public Object getChild(Object node, int index) {
		Marker m = (Marker) node;
		return m.get(index);
	}

	@Override
	public int getChildCount(Object node) {
		Marker m = (Marker) node;
		return m.countChildren();
	}

	@Override
	public int getIndexOfChild(Object parent, Object child) {
		int i;
		Marker p = (Marker) parent;
		Marker c = (Marker) child;
		for (i = p.countChildren(); i > -1; i--) {
			if (p.get(i).equals(c)) {
				break;
			}
		}
		return i;
	}

	@Override
	public Object getRoot() {
		return root;
	}

	@Override
	public boolean isLeaf(Object node) {
		Marker m = (Marker) node;
		return m.isLeaf();
	}

	@Override
	public void addTreeModelListener(TreeModelListener l) {
	}

	@Override
	public void removeTreeModelListener(TreeModelListener l) {
	}

	@Override
	public void valueForPathChanged(TreePath path, Object newValue) {
	}

}

und das ist mein Hauptfenster:
Java:
package com.guni;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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.TreeModel;
import javax.swing.tree.TreeSelectionModel;

public class MainWindow extends JFrame implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	private Marker rootnode;
	private JTree tree;

	public static void main(String[] args) throws Exception {
		new MainWindow();
	}
	
	public MainWindow() throws Exception {
		init();
		TreeModel model = new MarkerTreeModel(rootnode);
		JPanel treepanel = new JPanel(new FlowLayout());
		JPanel commandpanel = new JPanel(new FlowLayout());
		tree = new JTree(model);
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		
		JScrollPane treeView = new JScrollPane(tree);
		JButton btnAdd = new JButton("Add");
		JButton btnRemove = new JButton("Remove");
		JButton btnRename = new JButton("Rename");
		JButton btnSave = new JButton("Save");
		
		treeView.setPreferredSize(new Dimension(400,400));
		btnAdd.addActionListener(this);
		btnRemove.addActionListener(this);
		btnRename.addActionListener(this);
		btnSave.addActionListener(this);
		
		treepanel.add(treeView);
		commandpanel.add(btnAdd);
		commandpanel.add(btnRemove);
		commandpanel.add(btnRename);
		commandpanel.add(btnSave);
		this.getContentPane().add(treepanel, BorderLayout.NORTH);
		this.getContentPane().add(commandpanel, BorderLayout.SOUTH);
		
		
		this.setTitle("Sermon Player");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public void init() {
		rootnode = new Marker("Root");
		Marker unterpunkt1 = new Marker("Punkt 1");
		unterpunkt1.add(new Marker("Detail A"));
		unterpunkt1.add(new Marker("Detail B"));
		unterpunkt1.add(new Marker("Detail C"));
		unterpunkt1.add(new Marker("Detail D"));
		rootnode.add(unterpunkt1);
		rootnode.add(new Marker("Punkt 2"));
		rootnode.add(new Marker("Punkt 3"));
		rootnode.add(new Marker("Punkt 4"));
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand().toLowerCase();
		Marker m = (Marker) tree.getLastSelectedPathComponent();
		
		if (e != null) {
			if (command.equals("add")) {
				String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
				Marker child = new Marker(heading);
				m.add(child);
				tree.repaint();
			} else if (command.equals("remove")) {
				System.out.println("Removing node " + m);
				Marker parent = m.getParent();
				if (parent != null) {
					System.out.println(parent);
					parent.remove(m);
				} else {
					System.out.println("Can't remove root node");
				}
				tree.repaint();
			} else if (command.equals("rename")) {
				String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
				m.setHeading(heading);
				tree.repaint();
			} else if (command.equals("save")) {
				rootnode.dump();
			}
		}
	}

}

Klicke ich auf "Save", so sehe ich, dass meine Nodes auch tatsächlich entfernt werden.
Nur werden sie im Tree trotzdem noch angezeigt!

Kann mir irgendwer sagen was ich falsch mache?!

mfg, guni
 

guni

Bekanntes Mitglied
ja. hab ich mir angeschaut. Trotzdem: meine Lösung funktioniert auch (siehe Buttonklick auf Speichern).
Mit dem einzigen Unterschied, dass die ANSICHT nicht aktualisiert wird.
Aber: rename und add funktionieren!
Das versteh ich nicht.

mfg, guni
 

guni

Bekanntes Mitglied
Leute ich check's nicht!

im Tutorial "How to use Trees" hab ich folgenden Satz gefunden:

"Note that although DefaultMutableTreeNode has methods for changing a node's content, changes should go through the DefaultTreeModel cover methods. Otherwise, the tree model events would not be generated, and listeners such as the tree would not know about the updates."

das ist für mich allerdings ein Widerspruch zu
"A JTree object does not actually contain your data; it simply provides a view of the data. Like any non-trivial Swing component, the tree gets data by querying its data model."

wenn ich meine TreeNode verändere, dann ändert sich doch mein Datenmodell!! Wenn der Tree nun keine Daten beinhaltet, sondern nur darstellt, dann müsste doch mein remove-Button die Änderung auch im Tree darstellen. Schließlich existiert die entfernte Node zum Zeitpunkt des Repaints doch gar nicht mehr!

Bitte um Hilfe! Ich versteh das nicht!

mfg, guni
 

Michael...

Top Contributor
"Note that although DefaultMutableTreeNode has methods for changing a node's content, changes should go through the DefaultTreeModel cover methods. Otherwise, the tree model events would not be generated, and listeners such as the tree would not know about the updates."

das ist für mich allerdings ein Widerspruch zu
"A JTree object does not actually contain your data; it simply provides a view of the data. Like any non-trivial Swing component, the tree gets data by querying its data model."
Wo siehst Du da jetzt einen Widerspruch?
wenn ich meine TreeNode verändere, dann ändert sich doch mein Datenmodell!! Wenn der Tree nun keine Daten beinhaltet, sondern nur darstellt, dann müsste doch mein remove-Button die Änderung auch im Tree darstellen. Schließlich existiert die entfernte Node zum Zeitpunkt des Repaints doch gar nicht mehr!
repaint() ist ja mehr wie eine Bitte. Keine Ahnung wie genau das in dem Fall implementiert ist bzw. was dahinter steckt. Aber vielleicht "denkt" sich der Tree: Mein Model hat mir nichts von einer Änderung gesagt, also kann ich das Neuzeichnen bleiben lassen.

JTree ist eine recht komplexe Komponente, wenn ich unbedingt ein eigenes TreeModel bräuchte würde ich von DefaultTreeModel erben - hier sind ausreichend Methoden implementiert um den JTree über diverser Zustandsänderungen des Models zu benachrichtigen.
 
S

SlaterB

Gast
JTree malt immer genau das was das Model sagt,
das Model ist eine Kontrollstruktur die die Nodes des JTrees verwaltet,

was in diesem Netz von Objekten passiert kann das Model nicht nachvollziehen, man muss dem Model Bescheid sagen, damit dieses der View Bescheid sagen kann

-----

vergleichendes Beispiel:
JTree = Anzeige = Leuchttafel einer Parkgarage, 'noch 50 Plätze frei'
TreeModel = Model/Controller = internes Programm der Parkgarage, verknüpft mit Ein- und Ausfahrt
Tree/Nodes = reine Daten = Parkplätze in der Garage

wenn du ein Auto ist deine Jackentasche steckst und zu Fuss rausgehst, dann bekommt niemand mit, dass der Parkplatz frei ist,
nur einmal pro Jahr läuft irgendjemand manuell das ganze Gebäude ab und führt eine Inventarliste,

wenn du dagegen mit dem Auto den offiziellen Ausgang hinausfährst, dann erfährt die Garagenverwaltung davon
und kann der unwichtigen kleinen Leuchttafel mitteilen, dass ein Platz mehr als frei anzuzeigen ist,

die View Leuchttafel/ JTree ist vollkommen doof, soll nur schick graphisch leuchten,
das Model ist der King und muss alles wissen,
die Daten für sich sind wichtig, aber Änderungen dort hinter dem Rücken des Models können keine Auswirkungen haben,
es gibt keine automatische Prüfung, keinen magischen Transport der Information
 

guni

Bekanntes Mitglied
Hi Slater B,

wow! das ist ein toller Vergleich!
Wirklich!
Aber was ich nicht verstehe ist, warum dann meine add / meine rename-Funktion trotzdem funktioniert?!

mfg, guni
 
S

SlaterB

Gast
das add() in den Node-Klassen kann keine Auswirkungen haben,
wenn dann geht es um den repaint()-Prozess, da wird dann doch der aktuell selektierte Node ein wenig genauer angeschaut,
allein schon um ihn als Blatt oder Zwischenknoten darzustellen (abhängig davon ob Kinder da sind),
ds wird nicht gemerkt sondern neu nachgeprüft

undenkbar wäre es auch nicht, dass der Parent halbwegs geprüft wird,
meine Erläuterungen gingen eher hin zu ganz anderen aktuell nicht betrachteten Stellen im Baum
 

guni

Bekanntes Mitglied
Hallo,

ich habe jetzt versucht, meine ganze Logik in das Model / den Listener auszulagern. Leider ohne Erfolg. Nach wie vor funktioniert meine Add-/ meine Rename-Funktion; die Remove Funktion tut nichts. Ausserdem wird bei der Add-Funktion (Anlegen eines neuen Kindknotens) der Kindknoten erst angezeigt, wenn dann auf den Parent-Knoten doppelt geklickt wird.

hier mein Code:

MAINWINDOW stellt den Baum dar
Java:
package com.guni;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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.TreeModel;
import javax.swing.tree.TreeSelectionModel;

public class MainWindow extends JFrame implements ActionListener {
	
	private static final long serialVersionUID = 1L;
	private Marker rootnode;
	private JTree tree;
	private MarkerTreeModel model;

	public static void main(String[] args) throws Exception {
		new MainWindow();
	}
	
	public MainWindow() throws Exception {
		init();
		model = new MarkerTreeModel(rootnode);
		tree = new JTree(model);
		
		JPanel treepanel = new JPanel(new FlowLayout());
		JPanel commandpanel = new JPanel(new FlowLayout());
		tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
		
		JScrollPane treeView = new JScrollPane(tree);
		JButton btnAdd = new JButton("Add");
		JButton btnRemove = new JButton("Remove");
		JButton btnRename = new JButton("Rename");
		JButton btnSave = new JButton("Save");
		
		treeView.setPreferredSize(new Dimension(400,400));
		btnAdd.addActionListener(this);
		btnRemove.addActionListener(this);
		btnRename.addActionListener(this);
		btnSave.addActionListener(this);
		
		treepanel.add(treeView);
		commandpanel.add(btnAdd);
		commandpanel.add(btnRemove);
		commandpanel.add(btnRename);
		commandpanel.add(btnSave);
		this.getContentPane().add(treepanel, BorderLayout.NORTH);
		this.getContentPane().add(commandpanel, BorderLayout.SOUTH);
		
		
		this.setTitle("Sermon Player");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.pack();
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public void init() {
		rootnode = new Marker("Root");
		Marker unterpunkt1 = new Marker("Punkt 1");
		unterpunkt1.add(new Marker("Detail A"));
		unterpunkt1.add(new Marker("Detail B"));
		unterpunkt1.add(new Marker("Detail C"));
		unterpunkt1.add(new Marker("Detail D"));
		rootnode.add(unterpunkt1);
		rootnode.add(new Marker("Punkt 2"));
		rootnode.add(new Marker("Punkt 3"));
		rootnode.add(new Marker("Punkt 4"));
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String command = e.getActionCommand().toLowerCase();
		Marker selectedMarker = (Marker) tree.getLastSelectedPathComponent();
		
		if (e != null) {
			if (command.equals("add")) {
				String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
				Marker child = new Marker(heading);
				model.addMarker(selectedMarker, child);
			} else if (command.equals("remove")) {
				model.removeMarker(selectedMarker);
			} else if (command.equals("rename")) {
				String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
				model.renameMarker(selectedMarker, heading);
			} else if (command.equals("save")) {
				rootnode.dump();
			}
		}
	}

}

Marker -> meine Tree Nodes
Java:
package com.guni;

import java.util.Vector;

public class Marker {
	private static final long serialVersionUID = 1L;
	private String heading;
	private Marker parent;
	private Vector<Marker> children;
	
	public Marker(String heading) {
		super();
		this.heading = heading;
		this.parent = null;
		this.children = new Vector<Marker>();
	}
	
	public void setHeading(String heading) {
		this.heading = heading;
	}
	
	public String getHeading() {
		return this.heading;
	}
	
	public void setParent(Marker m) {
		this.parent = m;
	}
	
	public Marker getParent() {
		return this.parent;
	}
	
	public void add(Marker m) {
		m.parent = this;
		this.children.add(m);
	}
	
	public void add(int index, Marker m) {
		m.parent = this;
		this.children.add(index, m);
	}
	
	public void remove(Marker m) {
		this.children.remove(m);
	}
	
	public void remove(int index) {
		this.children.remove(index);
	}
	
	public Marker get(int index) {
		return this.children.get(index);
	}
	
	public int countChildren() {
		return this.children.size();
	}
	
	public boolean isLeaf() {
		return countChildren() == 0;
	}
	
	public void dump() {
		for (int i=0; i<countChildren(); i++) {
			Marker child = children.get(i);
			System.out.println(child);
			child.dump();
		}
	}
	
	public String toString() {
		return this.heading;
	}
}

das Model:
Java:
package com.guni;

import java.util.Vector;

import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class MarkerTreeModel implements TreeModel {
	private Vector<TreeModelListener> listeners;
	private Marker root;
	private final static int TREE_NODES_CHANGED = 0;
	private final static int TREE_NODES_INSERTED = 1;
	private final static int TREE_NODES_REMOVED = 2;
	private final static int TREE_STRUCTURE_CHANGED = 3;

	public MarkerTreeModel(Marker root) {
		this.listeners = new Vector<TreeModelListener>();
		this.addTreeModelListener(new MarkerTreeModelListener());
		this.root = root;
	}

	@Override
	public Object getChild(Object node, int index) {
		Marker m = (Marker) node;
		return m.get(index);
	}

	@Override
	public int getChildCount(Object node) {
		Marker m = (Marker) node;
		return m.countChildren();
	}

	@Override
	public int getIndexOfChild(Object parent, Object child) {
		int i;
		Marker p = (Marker) parent;
		Marker c = (Marker) child;
		for (i = p.countChildren(); i > -1; i--) {
			if (p.get(i).equals(c)) {
				break;
			}
		}
		return i;
	}

	@Override
	public Object getRoot() {
		return root;
	}

	@Override
	public boolean isLeaf(Object node) {
		Marker m = (Marker) node;
		return m.isLeaf();
	}

	@Override
	public void addTreeModelListener(TreeModelListener l) {
		listeners.add(l);
	}

	@Override
	public void removeTreeModelListener(TreeModelListener l) {
		listeners.remove(l);
	}

	@Override
	public void valueForPathChanged(TreePath path, Object newValue) {
	}

	// Methoden zum Verändern von Ereignissen
	public void addMarker(Marker parent, Marker child) {
		parent.add(child);
		this.fireTreeNodesInserted(this, parent);
	}

	public void removeMarker(Marker markerToRemove) {
		Marker parent = markerToRemove.getParent();
		if (parent != null) {
			parent.remove(markerToRemove);
			fireTreeNodesRemoved(this, markerToRemove);
		} else {
			System.out.println("Can't remove root marker");
		}
	}

	public void renameMarker(Marker m, String newName) {
		m.setHeading(newName);
		fireTreeNodesChanged(this, m);
	}

	// Methoden zum Aufruf der Listener
	protected void fireTreeNodesChanged(MarkerTreeModel source, Marker current) {
		raiseEvent(current, TREE_NODES_CHANGED);
	}

	protected void fireTreeNodesInserted(MarkerTreeModel source, Marker current) {
		raiseEvent(current, TREE_NODES_INSERTED);
	}

	protected void fireTreeNodesRemoved(MarkerTreeModel source, Marker current) {
		raiseEvent(current, TREE_NODES_REMOVED);
	}

	protected void fireTreeStructureChanged(MarkerTreeModel source,
			Marker current) {
		raiseEvent(current, TREE_STRUCTURE_CHANGED);
	}

	// Hilfsmethoden
	private void raiseEvent(Marker current, int event) {
		TreeModelEvent tme = new TreeModelEvent(this, getMarkersToRoot(current));
		for (TreeModelListener tml : listeners) {
			switch (event) {
			case TREE_NODES_CHANGED:
				tml.treeNodesChanged(tme);
				break;
			case TREE_NODES_INSERTED:
				tml.treeStructureChanged(tme);
				break;
			case TREE_NODES_REMOVED:
				tml.treeNodesRemoved(tme);
				break;
			case TREE_STRUCTURE_CHANGED:
				tml.treeStructureChanged(tme);
				break;
			default:
				System.out.println("Unknown event raised");
				return;
			}
		}
	}

	private Marker[] getMarkersToRoot(Marker current) {
		Vector<Marker> markers = new Vector<Marker>();
		getMarkersToRoot(markers, current);
		return markers.toArray(new Marker[] {});
	}

	private void getMarkersToRoot(Vector<Marker> markers, Marker current) {
		Marker parent = current.getParent();
		markers.add(current);
		if (parent != null) {
			getMarkersToRoot(markers, parent);
		}
	}
}

der Listener:
Java:
package com.guni;

import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;

public class MarkerTreeModelListener implements TreeModelListener {

	@Override
	public void treeNodesChanged(TreeModelEvent e) {
		System.out.println("Changed" + e.getPath()[0]);
	}

	@Override
	public void treeNodesInserted(TreeModelEvent e) {
		System.out.println("Inserted" + e);
	}

	@Override
	public void treeNodesRemoved(TreeModelEvent e) {
		System.out.println("Removed" + e);
	}

	@Override
	public void treeStructureChanged(TreeModelEvent e) {
		System.out.println("Structure" + e);
	}

}

ich komm nicht mehr weiter! Bitte um Hilfe.
gn8, guni
 
S

SlaterB

Gast
nettes Rätsel, da hat man ja zu tun, aber bewältigt ;)

zunächst einfach: du denkst dir da irgenwelche Events aus, ziemlich spezifisch mit
> new TreeModelEvent(this, getMarkersToRoot(current))
aber doch nicht völlig korrekt, schau dir DefaultTreeModel an, wenn du den Quellcode nicht hast kann ich ihn posten,

um das add() zu testen habe ich beispielsweise in die raiseEvent-Methode
Java:
        int cCount = current.countChildren();
        int[] newIndexs = new int[1];
        newIndexs[0] = cCount - 1;
        Object[] newChildren = new Object[1];
        newChildren[0] = current.get(cCount - 1);

        TreeModelEvent tme = new TreeModelEvent(this, getMarkersToRoot(current), newIndexs, newChildren);
eingefügt, das ist nur für add() richtig,
schon bei add(index) kann es anders aussehen, richtige Indexe verwenden,
remove natürlich wieder ganz anders, habe ich noch nicht angeschaut, einfach ans Original anlehen statt sich halb-beliebige Events auszudenken (?!)

-----

in getIndexOfChild muss die Schleife
> for (i = p.countChildren() - 1; i > -1; i--)
lauten

bzw. man schreibt dann üblicherweise
> for (i = p.countChildren() - 1; i >= 0; i--)
----

besonders gemein war noch eine falsche getMarkersToRoot-Liste, die Reihenfolge muss andersrum sein,
kann man an der Ausgabe der Events in deinem Programm und im Standard-Beispiel von
How to Use Trees (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
sehen
 

guni

Bekanntes Mitglied
Hi SlaterB,

oh mann!
danke!
ich dachte "hauptsache ich hab ein gültiges TreeModelEvent ...
hmm ... das sieht ja nach einer Menge von Arbeit aus.
irgendwie war ich am Überlegen, ob ich Marker mal durch ein DOM-Element austausche; aber ich glaub das lass ich besser.
Dafür dann ein Model zu schreiben (mit dem man die Nodes auch bearbeiten kann) wirkt extrem aufwändig! Mal sehen. Vielleicht find ich irgendeine andere Lösung oder kann mir irgendwas über die DefaultMultableTreeNode herumbasteln!

mfg, guni
 
S

SlaterB

Gast
das TreeModel komplett nachzubauen scheint in der Tat nicht sehr sinnvoll,
was spricht gegen das ursprügliche? Marker muss nur das TreeNode-Interface implementieren

notfalls einen Dummy-Node von DefaultMultableTreeNode erben lassen mit einem Attribut auf das Marker-Objekt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Swing JTree UI Probleme AWT, Swing, JavaFX & SWT 6
G JTree - Observer oder Listener? AWT, Swing, JavaFX & SWT 6
L Swing [JTree] Selektierte Nodes nummerieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben