DefaultTreeCellEditor - Fragen zur Groesse und zum Icon beim Editieren

FerFemNemBem

Bekanntes Mitglied
Mahlzeit,

ich habe mir einen Baum gebastelt, welcher Checkboxen und Icons fuer Dateitypen darstellen kann. Das funktioniert mittlerweile auch alles recht schoen. Wenn ich jedoch einen Knoten editiere, verschwindet die Checkbox und es wird wieder das Standard-Icon dargestellt. Hier mal 2 Bilder zum besseren Verstaendniss:

Im "normalen" Modus ist alles fein:
Baum_ok.jpg


Im edit Modus fehlt die Checkbox und das Icon ist nicht mehr mein Angepasstes:
Baum_falsch.jpg


Ich habe absolut keine Ahnung wo ich hier ansetzen koennte, um den Baum beim Editieren genauso aussehen zu lassen, wie im normalen Modus.

Hat jemand einen Tip?

Danke!

Gruss, FFNB.
 

Michael...

Top Contributor
Das schaut nach dem normalen DefaultCellEditor aus. Ähnlich wie beim Renderer musst Du auch beim Editor die Komponente die zum Editieren genutzt werden soll definieren. Wenn Renderer und Editor identisch aussehen sollen bietet es sich an die Komponente in einer eigenen Klasse zu definieren und dem Renderer und Editor jeweils eine Instanz davon mitzugeben.
 

FerFemNemBem

Bekanntes Mitglied
Mahlzeit,

irgendwie komme ich da nicht so recht klar. Kannst Du mir bitte noch 1-2 Tips geben?

Ich habe als Komponente ein JPanel, auf welchem die Checkbox und ein Label platziert ist. Dieses uebergebe ich nun dem "CellRenderer", welcher das dann in "getTreeCellRendererComponent" zurueckgibt. Das sieht alles schick aus und funktioniert auch.

Dieses JPanel uebergebe ich auch dem CellEditor und lasse es beim Aufruf von "getTreeCellEditorComponent" zurueckgeben. Das scheint aber falsch zu sein, da ich dann ja nichts editieren kann. Muesste ich da nicht ein JTextField oder sowas zurueckgeben? Wenn ja, dann kann ich doch gar nicht die gleiche Komponente nehmen?

Schieb mich bitte mal jemand in die richtige Richtung...

Danke!

Gruss, FFNB.
 

Michael...

Top Contributor
Mahlzeit,

irgendwie komme ich da nicht so recht klar. Kannst Du mir bitte noch 1-2 Tips geben?

Ich habe als Komponente ein JPanel, auf welchem die Checkbox und ein Label platziert ist. Dieses uebergebe ich nun dem "CellRenderer", welcher das dann in "getTreeCellRendererComponent" zurueckgibt. Das sieht alles schick aus und funktioniert auch.

Dieses JPanel uebergebe ich auch dem CellEditor und lasse es beim Aufruf von "getTreeCellEditorComponent" zurueckgeben. Das scheint aber falsch zu sein, da ich dann ja nichts editieren kann. Muesste ich da nicht ein JTextField oder sowas zurueckgeben? Wenn ja, dann kann ich doch gar nicht die gleiche Komponente nehmen?
Nur wenn Sie identisch dargestellt werden sollen, kann man das gleiche Objekt (niemals aber das selbe) nehmen. Wenn für den Renderer auch der Text mittels JTextField editiert werden soll, ist das natürlich nicht der Fall.
Nicht gerade schön aber sollt zumindenst einen Ansatz liefern:
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.EventObject;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
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;

@SuppressWarnings("serial")
public class TreeCheckEditorRendererDemo extends JFrame {
	private JTree tree;
	private DefaultTreeModel model;

	public TreeCheckEditorRendererDemo() {
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
		DefaultMutableTreeNode node = new DefaultMutableTreeNode("anothernode");
		root.add(node);
		node.add(new DefaultMutableTreeNode(new CheckableTreeNodeObject("child1")));
		node.add(new DefaultMutableTreeNode(new CheckableTreeNodeObject("child2")));
		
		root.add(new DefaultMutableTreeNode(new CheckableTreeNodeObject("child3")));
		
		model = new DefaultTreeModel(root);
		tree = new JTree(model);
		Icon icon = createDummyIcon();
		tree.setCellRenderer(new CustomRenderer(icon));
		tree.setCellEditor(new CustomEditor(tree, icon));
		tree.setEditable(true);

		this.getContentPane().add(tree);
	}
	
	private static Icon createDummyIcon() {
		BufferedImage img = new BufferedImage(20, 20, BufferedImage.TYPE_INT_ARGB);
		Graphics2D g = img.createGraphics();
		g.setColor(Color.RED);
		g.fillRect(0, 0, 15, 15);
		g.setColor(Color.BLUE);
		g.fillRect(5, 5, 15, 15);
		g.dispose();
		return new ImageIcon(img);
	}
	
	class CheckableTreeNodeObject {
		private String text;
		private boolean selected;
		
		public CheckableTreeNodeObject(String text) {
			this.text = text;
		}
		
		public String getText() {
			return text;
		}

		public void setText(String text) {
			this.text = text;
		}

		public boolean isSelected() {
			return selected;
		}

		public void setSelected(boolean selected) {
			this.selected = selected;
		}
	}

	class CustomRenderer extends DefaultTreeCellRenderer {
		private JPanel panel;
		private JCheckBox box;
		private JLabel label;

		public CustomRenderer(Icon icon) {
			panel = new JPanel();
			panel.add(box = new JCheckBox());
			panel.add(new JLabel(icon));
			panel.add(label = new JLabel());
		}

		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.getUserObject() instanceof CheckableTreeNodeObject) {
				CheckableTreeNodeObject o = (CheckableTreeNodeObject)treeNode.getUserObject();
				box.setSelected(o.isSelected());
				label.setText(o.getText());
				return panel;
			}
			this.setIcon(null);
			return this;
		}
	}

	class CustomEditor implements TreeCellEditor {
		private JTree tree;
		private CheckableTreeNodeObject ctno;
		private JPanel panel;
		private JCheckBox box;
		private JTextField field;

		public CustomEditor(JTree tree, Icon icon) {
			this.tree = tree;
			panel = new JPanel();
			panel.add(box = new JCheckBox());
			panel.add(new JLabel(icon));
			panel.add(field = new JTextField());
			
			box.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					if (ctno!=null)
						ctno.setSelected(box.isSelected());
				}
			});
			field.addKeyListener(new KeyAdapter() {
				public void keyTyped(KeyEvent evt) {
					if (evt.getKeyChar()==KeyEvent.VK_ENTER) {
						if (ctno!=null)
							ctno.setText(field.getText());
						CustomEditor.this.tree.stopEditing();
					}
				}
			});
		}

		public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
				boolean leaf, int row) {
			DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value;
			if (treeNode.getUserObject() instanceof CheckableTreeNodeObject) {
				ctno = (CheckableTreeNodeObject)treeNode.getUserObject();
				box.setSelected(ctno.isSelected());
				field.setText(ctno.getText());
				return panel;
			}
			ctno = null;
			return null;
		}

		public Object getCellEditorValue() {
			return ctno;
		}

		public boolean isCellEditable(EventObject evt) {
			if (evt instanceof MouseEvent) {
				MouseEvent me = (MouseEvent)evt;
				DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getPathForLocation(me.getX(), me.getY()).getLastPathComponent();
				return node.getUserObject() instanceof CheckableTreeNodeObject;
			}
			return false;
		}

		public boolean stopCellEditing() {
			return true;
		}

		public void addCellEditorListener(CellEditorListener l) {
		}

		public void cancelCellEditing() {
		}

		public void removeCellEditorListener(CellEditorListener l) {
		}

		public boolean shouldSelectCell(EventObject anEvent) {
			return false;
		}
	}

	public static void main(String[] args) {
		JFrame frame = new TreeCheckEditorRendererDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P DefaultTreeCellEditor -> Anzeige Probleme AWT, Swing, JavaFX & SWT 3
thor_norsk Allgemeine Fragen AWT, Swing, JavaFX & SWT 6
thor_norsk Allgemeine Fragen AWT, Swing, JavaFX & SWT 4
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
D Fragen zur GUI AWT, Swing, JavaFX & SWT 4
M NetBeans JFrame Grundlangen fragen AWT, Swing, JavaFX & SWT 6
T JavaFX Allgemeine Fragen zu JavaFX (uA zu Properties) AWT, Swing, JavaFX & SWT 6
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
N Swing Fragen zu non-modal JDialog AWT, Swing, JavaFX & SWT 1
Q Fragen zur JMenuBar & Co. AWT, Swing, JavaFX & SWT 3
Kenan89 JMenu Fragen AWT, Swing, JavaFX & SWT 5
Luk10 (LWJGL) Fragen zu VBOs AWT, Swing, JavaFX & SWT 21
M Swing JTextPane + Scrollbar = Fragen AWT, Swing, JavaFX & SWT 15
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
Luk10 Fragen zum Laden von Fonts AWT, Swing, JavaFX & SWT 4
Luk10 Fragen zum Koordinaten System AWT, Swing, JavaFX & SWT 3
M JTable Grundlegende Fragen AWT, Swing, JavaFX & SWT 4
B Prozentrechner GUI Fragen AWT, Swing, JavaFX & SWT 4
H Fragen zu JPanel und JButton AWT, Swing, JavaFX & SWT 3
Q Swing Zeichenprogramm, grundlegende Fragen AWT, Swing, JavaFX & SWT 8
U Swing Fragen bezüglich Multithreaded GUIs (Grundlagen): AWT, Swing, JavaFX & SWT 3
R LayoutManager GridBagLayout Fragen AWT, Swing, JavaFX & SWT 10
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
M LayoutManager Einige Fragen zum GridBagLayout AWT, Swing, JavaFX & SWT 13
H Swing Zwei Fragen AWT, Swing, JavaFX & SWT 5
S 2D-Grafik Diverse Fragen zu Imagemanipulation in Java AWT, Swing, JavaFX & SWT 11
C Swing Grundsätzliche Fragen zu MVC AWT, Swing, JavaFX & SWT 8
F 3 Fragen zu Applets AWT, Swing, JavaFX & SWT 4
L Klick auf JTable -> EditorPane manipulieren, Fragen zu TableModel AWT, Swing, JavaFX & SWT 9
S Fragen zu GridBagLayout AWT, Swing, JavaFX & SWT 6
B Zeichnen in Swing - Jede Menge Fragen! AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
D GridBagLayout und JEditorPane (mehrere fragen) AWT, Swing, JavaFX & SWT 2
A Swing einfache fragen zu frame AWT, Swing, JavaFX & SWT 10
P Mehrere Fragen AWT, Swing, JavaFX & SWT 4
A Fragen zu Microber AWT, Swing, JavaFX & SWT 4
C Mehrer Fragen zu großem kompletten Swing Beispiel AWT, Swing, JavaFX & SWT 5
T Fragen zu JList und DnD AWT, Swing, JavaFX & SWT 13
I Einige Fragen zu JList AWT, Swing, JavaFX & SWT 6
I Drei Fragen/Probleme mit einer JTable AWT, Swing, JavaFX & SWT 9
G Fragen zum FileChooser AWT, Swing, JavaFX & SWT 5
M 2 Kleine Fragen zum JOptionFrame AWT, Swing, JavaFX & SWT 5
G performance fragen zu AWT, Swing AWT, Swing, JavaFX & SWT 14
J Fragen zu JTable und JScrollpane AWT, Swing, JavaFX & SWT 2
R Frage zu Listfeld oder jTable, auch andere Fragen AWT, Swing, JavaFX & SWT 5
C Fragen zur Darstellung einer JTable mittels Renderer AWT, Swing, JavaFX & SWT 2
ModellbahnerTT Fragen zu AWT AWT, Swing, JavaFX & SWT 3
S Fragen Databinding? AWT, Swing, JavaFX & SWT 3
J Fragen zu AWT Komponenten AWT, Swing, JavaFX & SWT 5
U 2 Fragen zu BufferedImages AWT, Swing, JavaFX & SWT 19
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
J Fragen zum SyntaxHighlighting (DefaultStyledDocument) AWT, Swing, JavaFX & SWT 2
I Ein paar SWT Fragen AWT, Swing, JavaFX & SWT 10
P Zwei Fragen zu Bildern in Applets AWT, Swing, JavaFX & SWT 2
isowiz Einige Fragen zur ersten eigenen Sing-Applikation AWT, Swing, JavaFX & SWT 4
G 2 Fragen JDesktopPane AWT, Swing, JavaFX & SWT 4
S Fragen zu einem Beispiel(Swings und AWT) AWT, Swing, JavaFX & SWT 33
G Fragen zum Ocean Look and Feel AWT, Swing, JavaFX & SWT 3
G Neue Komponente erstellen - Fragen/Probleme mit MouseEvents AWT, Swing, JavaFX & SWT 2
Y 2 Fragen- JList Inhalt ändern und Fenster invisible setzen AWT, Swing, JavaFX & SWT 5
C Gemischte Fragen AWT, Swing, JavaFX & SWT 10
G Fragen zu JList AWT, Swing, JavaFX & SWT 12
K 2 fragen:JCheckBoxMenuItem und ComboBox AWT, Swing, JavaFX & SWT 2
T Mehrere Fragen zu JToolBar AWT, Swing, JavaFX & SWT 2
N 2 Fragen (zu binärem Suchen und Scrollbar) AWT, Swing, JavaFX & SWT 6
B Einige Fragen zum GUI AWT, Swing, JavaFX & SWT 3
T Swing JEditorPane Groesse berechnen AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane fasst JPanel und Groesse des JPanels soll sich aendern AWT, Swing, JavaFX & SWT 2
G GridBags mit konstanter Groesse AWT, Swing, JavaFX & SWT 13
L JComboBox -> Groesse der Listeneintraege aendern AWT, Swing, JavaFX & SWT 4
L JTabbedPane: Tab-Groesse aendern AWT, Swing, JavaFX & SWT 11
T JTable Groesse AWT, Swing, JavaFX & SWT 3
M int frame groesse festlegen AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben