JTree Node mit Text plus JComboBox

hiwi

Mitglied
Hallo nochmal,
gibt es einen Trick wie man einen Knoten im JTree mit einem Text und daneben mit einer Combobox ausstatten kann? Mit einer Erweiterung des DefaultTreeCellRenderers bin ich da noch nicht auf die richtige Idee gekommen, da dieser ja ein JLabel erweitert und ein JLabel kann unr Text plus Bild (Icon) besitzen. Aber vielleicht gibt es ja noch eine Idee, auf die ich noch nicht gekommen bin. Ein JTableTree finde ich selber nicht so schön, da es zu viel Overhead wäre, optisch gesehen. Also speziell gesagt will ich neben dem Namen des Layouts (zB "meinNeuesLayoutVom12.7.2010") noch ein DropdownMenu (oder Combobox) haben, wo man auswählen kann, welchen Typen (zB "RandomLayout", "CircleLayout" o.ä.) das Layout bekommt.
Hat irgendwer eine Idee?
Danke! :)
 

Michael...

Top Contributor
Der Renderer stellt nur die Ansicht des Knotens dar. Wenn Du beim Bearbeiten des Knotens eine eigene Komponte verwenden willst: TreeCellEditor. Hab's selbst noch nicht ausprobiert, kenn's nur von JTable
 

hiwi

Mitglied
das scheint zu klappen. es gibt aber noch probleme. :oops:
fang ich mal mit dem ersten an. vielleicht ergibt sich der rest von selbst, sonst müsste ich nochmal code posten.
wie komme ich im
Java:
getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row)
daran, wo ich mich gerade befinde im Baum? Also ich will if-abfragen machen, wenn der knoten über diesem Knoten "Layouts" heißt, bzw das UserObject ein String namens "Layouts" ist, dann erstelle die Zelle so, und wenn sie 2 darunter ist, dann erstelle sie so...
Danke nochmal :)
 

KrokoDiehl

Top Contributor
Ohne es nun 100%ig zu wissen; Aber das übergebene
Code:
Object value
dürfte doch der TreeNode des Baumes sein? In dem Fall kannst du es casten und über
Code:
getParentNode()
(oder so :oops:) den Elternknoten suchen.
Ansonsten hast du den JTree und den rowIndex, da müsste doch sicher auch was gehen, wenngleich es umständlicher wird.
 

hiwi

Mitglied
Ohne es nun 100%ig zu wissen; Aber das übergebene
Code:
Object value
dürfte doch der TreeNode des Baumes sein? In dem Fall kannst du es casten und über
Code:
getParentNode()
(oder so :oops:) den Elternknoten suchen.
Ansonsten hast du den JTree und den rowIndex, da müsste doch sicher auch was gehen, wenngleich es umständlicher wird.
Das mit dem value und dem casten war auch meine erste Idee. Das hat nciht funktioniert. Wobei,..., ich hab es glaub ich zum DefaultMutableTreeNode gecastet. Vll sollte ich es nochmal versuchen mit dem TreeNode. Mach ich morgen. Danke schonmal. Ich schreib dann ob es funktioniert hat.
 

Michael...

Top Contributor
In
Code:
value
steckt schon der Knoten, kannst ja mal schauen was Dir
Code:
System.out.println(value.getClass());
liefert.
 

hiwi

Mitglied
Ohne es nun 100%ig zu wissen; Aber das übergebene
Code:
Object value
dürfte doch der TreeNode des Baumes sein? In dem Fall kannst du es casten und über
Code:
getParentNode()
(oder so :oops:) den Elternknoten suchen.
.
Das klappt. Danke! :)
Zum nächsten Problem. ;-) Ich bin jetzt glaub ich dahintergekommen was der Editor ist. Und das ist nicht wirklich das, was mein Chef haben will.
Ich habe es jetzt so gemacht, dass ich bei der getTreeCellRendererComponent()-methode im Renderer nicht "this" zurückgebe, sondern eben ein JPanel mit einem JLabel und einer JComboBox drauf. Das anzeigen klappt auch. nur kann ich auf die ComboBox nicht zugreifen. :-( Sie reagiert nicht. Ist jetzt halt als wenn die ComboBox als Bild auf der Zelle ist, ohne Funktion. Hat irgendwer eine Idee? Vielleicht sollte ich das nochmal einzeln posten.
Danke für Hilfe!
hiwi
 

Michael...

Top Contributor
ein JPanel mit einem JLabel und einer JComboBox drauf. Das anzeigen klappt auch. nur kann ich auf die ComboBox nicht zugreifen. :-( Sie reagiert nicht. Ist jetzt halt als wenn die ComboBox als Bild auf der Zelle ist, ohne Funktion.
Was Du da beschreibst ist genau die Aufgabe des Renderers ein "Bild" zu erzeugen, dass als Knoten angezeigt wird.
Wenn Du editieren willst brauchst Du einen TreeCellEditor. Kann Dir aber mangels persönlicher Erfahrung nicht sagen wie man damit umgeht.
 

KrokoDiehl

Top Contributor
Es klingt jedenfalls so, als würde der Editor nichts mit den Events machen können. Für den JTree kommt ja ein JPanel als Editor zurück. Ich denke dass Mausklicks etc. irgendwie vergereicht werden müssen. Du kannst ja mal einen einfachen MouseListener an deinen JPanel hängen und Testausgaben reinmachen, analog mit der JComboBox, allein um zu sehen, ob dort was ankommt.

Andere Sache könnte der Fokus sein. Vielleicht reagiert eine JComboBox nicht, wenn sie keinen Fokus hat und vielleicht bekommt ein TreeCellEditor keinen Fokus, bzw. das JPanel bekommt ihn, sollte ihn aber an die JComboBox weiterreichen.
 

Michael...

Top Contributor
Da ich keine Lust auf Arbeit hatte: hier mal eine Demo. Die ist nur auf die Schnelle runtergeschrieben und durchaus noch optimierungsfähig und an einer Stelle habe ich ein bisschen getrickst.
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.EventObject;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.CellEditorListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellEditor;

public class TreeEditorRendererDemo extends JFrame {
	
	public  TreeEditorRendererDemo() {
		String[] values = new String[] {"Bier", "Limo", "Wein", "Wasser"};
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("Getränke");
		root.add(new DefaultMutableTreeNode(values[0]));
		root.add(new DefaultMutableTreeNode(values[0]));
		root.add(new DefaultMutableTreeNode(values[0]));
		
		DefaultTreeModel model = new DefaultTreeModel(root);
		JTree tree = new JTree(model);
		tree.setCellRenderer(new ComboRenderer(new NodeComponent(values)));
		tree.setCellEditor(new ComboEditor(tree, new NodeComponent(values)));
		tree.setEditable(true);
		this.getContentPane().add(tree);
	}
	
	class NodeComponent extends JPanel {
		private JComboBox box;
		
		public NodeComponent(String[] values) {
			this.setLayout(new GridLayout(1, 2));
			add(new JLabel("Auswahl: "));
			add(box = new JComboBox(values));
			box.setBackground(Color.WHITE);
		}
		
		public void setSelectedItem(Object obj) {
			box.setSelectedItem(obj);
		}
		
		public Object getCurrentObject() {
			return box.getSelectedItem();
		}
		
		public void addItemListener(ItemListener listener) {
			box.addItemListener(listener);
		}
	}
	
	class ComboRenderer extends DefaultTreeCellRenderer {
		private NodeComponent nodePanel;
		
		public ComboRenderer(NodeComponent comp) {
			nodePanel = comp;
		}
		
		public Component getTreeCellRendererComponent(JTree tree, Object value,
                boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    		super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    		DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
    		if (treeNode.isLeaf()) {
    			nodePanel.setSelectedItem(treeNode.getUserObject());
    			nodePanel.setBackground(super.getBackground());
    			return nodePanel;
    		}
    		this.setIcon(null);
    		return this;
    	}
	}
	
	class ComboEditor implements TreeCellEditor, ItemListener {
		private JTree tree;
		private NodeComponent nodePanel;
		
		public ComboEditor(JTree tree, NodeComponent comp) {
			this.tree = tree;
			this.nodePanel = comp;
			this.nodePanel.addItemListener(this);
		}
		
		public void itemStateChanged(ItemEvent e) {
			tree.stopEditing();
		}
		
		public Component getTreeCellEditorComponent(JTree tree, Object value,
				boolean isSelected, boolean expanded, boolean leaf, int row) {
    		DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
    		if (treeNode.isLeaf()) {
    			nodePanel.setSelectedItem(treeNode.getUserObject());
    			return nodePanel;
    		}
    		return tree.getCellRenderer().getTreeCellRendererComponent(tree, value, true, true, false, row, true);
		}

		public Object getCellEditorValue() {
			return nodePanel.getCurrentObject();
		}
		
		public boolean isCellEditable(EventObject anEvent) {
			return true;
		}
		
		public void addCellEditorListener(CellEditorListener l) {}
		public void cancelCellEditing() {}
		public void removeCellEditorListener(CellEditorListener l) {}
		public boolean shouldSelectCell(EventObject anEvent) {return false;}
		public boolean stopCellEditing() {return true;}		
	}
	
	public static void main(String[] args) {
		JFrame frame = new TreeEditorRendererDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 

hiwi

Mitglied
Da ich keine Lust auf Arbeit hatte: hier mal eine Demo. Die ist nur auf die Schnelle runtergeschrieben und durchaus noch optimierungsfähig und an einer Stelle habe ich ein bisschen getrickst.
Wow, vielen Dank! Das ist großartig! So sollte es aussehen. Ich meine von dieser einen Funktionalität her. Aber das war ja das Problem. Ich werd es bei mir einbauen. Vielen, vielen Dank!! :)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
A JTree Node Text ändern AWT, Swing, JavaFX & SWT 5
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
R JTree root Node AWT, Swing, JavaFX & SWT 2
N JTree node unselectable AWT, Swing, JavaFX & SWT 6
A Swing JTree Tree Node löschen AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
S JTree rendern der Knoten [+] und [-], nicht der Node Icons AWT, Swing, JavaFX & SWT 2
G JTree Node ggf. aufklappen bei Drag & Drop? AWT, Swing, JavaFX & SWT 7
O JTree Node sofort editieren AWT, Swing, JavaFX & SWT 2
J [JTree] Node updaten AWT, Swing, JavaFX & SWT 3
I JTree Node Name ändern AWT, Swing, JavaFX & SWT 2
T new JTree(node) wie node ändern AWT, Swing, JavaFX & SWT 3
W Node aus JTree löschen AWT, Swing, JavaFX & SWT 2
G JTree -- Node nach ändern in anderen Knoten AWT, Swing, JavaFX & SWT 15
P ID einer ausgewaehlten Node aus JTree ermitteln AWT, Swing, JavaFX & SWT 6
J JTree / delete node AWT, Swing, JavaFX & SWT 2
R JTree: Zeilenumbruch in Node AWT, Swing, JavaFX & SWT 6
F JTree Letzte Node auswählen AWT, Swing, JavaFX & SWT 8
S [JTree] mehrmals auf den selben Node klicken AWT, Swing, JavaFX & SWT 11
K jtree: nur "first node" in anderer hintergrundfarb AWT, Swing, JavaFX & SWT 4
EagleEye JTree Node löschen Problem AWT, Swing, JavaFX & SWT 4
A JTree nach Node durchsuchen und expanden AWT, Swing, JavaFX & SWT 5
G jtree (node, child) AWT, Swing, JavaFX & SWT 3
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
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
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
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
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben