JButton und JCheckBox im JTree reagieren nicht

Status
Nicht offen für weitere Antworten.

atarifreak

Aktives Mitglied
Hallo!

Ich habe den, zugegeben, etwas exotischen Schritt gewagt, hinter jeder Node im JTree einen JButton zu packen.
Dafür habe ich im Ausgabeergebis einer abgeleiteten Klasse von DefaultTreeCellRenderer statt "this" eine Kombination von "this" und einem JButton in einem JPanel bestimmt. Das sieht dann so aus:

Code:
				JPanel jp = new JPanel();
				jp.setBackground(new Color(255, 255, 255));
				jp.add(this);
				jp.add(new JCheckBox("markieren"));
				jbSave.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						System.out.println("button");
					}
				});
				jp.add(jbSave);
				cReturn = jp;

Dargestellt wird auch alles schön, ich kann die Knoten im Tree auch selektieren, aus- und einklappen, der JButton hinter den Nodes verhält sich jedoch völlig statisch, wie ein Bild, kann also nicht betätigt werden. Hat jemand eine Idee, wie man den aktivieren kann?
 

thE_29

Top Contributor
Toller Code zu deinem Problem ;) (ein ActionListener, na hui..)

Soll ich mir jetzt ne JTree zusammenbau und das testen??

Wie wärs mit dem ganzen Code??
 

atarifreak

Aktives Mitglied
Also der komplette Code sieht so aus:

Code:
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;

class TreeRenderer extends DefaultTreeCellRenderer
{
	static ImageIcon iiAction 	= new ImageIcon("action.gif");
	static ImageIcon iiRoot 	= new ImageIcon("root.gif");
	static JButton   jbSave		= new JButton("speichern");
	
	public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
	{
		ImageIcon iiReturn = null;
		JPanel jpReturn = new JPanel();
		Component cReturn = this;
		
		super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
		DefaultMutableTreeNode dmt = (DefaultMutableTreeNode)value;
		try
		{
			CmNode cn = (CmNode)dmt;
			System.out.println("style:"+cn.getStyle());
			if (cn.getStyle() == 0) iiReturn = iiRoot;
			if (cn.getStyle() == 1)
			{
				iiReturn = iiAction;
				JPanel jp = new JPanel();
				jp.setBackground(new Color(220, 220, 220));
				jp.setBorder(BorderFactory.createLineBorder(Color.black, 1));
				jp.add(this);
				jp.add(new JCheckBox("markieren"));
				jbSave.setEnabled(true);
				jbSave.addActionListener(new ActionListener()
				{
					public void actionPerformed(ActionEvent e)
					{
						System.out.println("button");
					}
				});
				jp.add(jbSave);
				cReturn = jp;
			}
			setBackgroundNonSelectionColor(new Color(220, 220, 220));
			setIcon(iiReturn);
		}
		catch (Exception e)
		{ }
		return cReturn;
	}
}

Eingebunden wird er dann mittels Tree.setCellRenderer(new TreeRenderer())

Soweit funktioniert das auch, aber eben nur in der Darstellung. Reagieren tut keine der beiden Komponenten auf Klick. Muß ich da noch irgendwie einen MouseListener implementieren?

Die Klasse CmNode sieht so aus:

Code:
import javax.swing.*;
import javax.swing.tree.*;

class CmNode extends DefaultMutableTreeNode
{
	int intStyle;
	
	public CmNode(String strCaption, int iStyle)
	{
		super(strCaption);
		intStyle = iStyle;
	}
	
	public int getStyle()
	{ return intStyle; }
}
 

thE_29

Top Contributor
1. catch (Exception e)
{ }

Für was gibt es Exception damit du die Ausgabe unterdrückst??

Gewöhnt euch mal an die Meldung auszugeben!!!

e.printStackTrace();

2. ist das sicher net der ganze Code?

Wo isn da ein main?
 
B

Beni

Gast
Damit du nicht nur Zeichnen, sondern auch interagieren kannst, musst du auch einen TreeCellEditor implementieren (ist fast dasselbe wie der Renderer, nur wird der Editor an einer einzigen Stelle angezeigt).
 

atarifreak

Aktives Mitglied
Die Exception gibt es deshalb, weil er im Renderer nicht nur Nodes empfängt, sondern auch Angaben zur Farbe usw. Dann gibts sonst ne ClassCastException. So nimmt er nur Objekte, die er auch casten kann.

Die Klasse, in der main vorkommt, sieht so aus:

Code:
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;

class MenuTreeView extends JTree
{
	DefaultTreeModel dtm;
	
	public MenuTreeView()
	{
		putClientProperty("JTree.lineStype", "Angled");
		setCellRenderer(new TreeRenderer());
		
                                CmNode nRoot = new CmNode("Root-Test", 1);

		dtm = new DefaultTreeModel(nRoot);
		setModel(dtm);
	}
	
	public static void main(String args[])
	{
		JFrame jf = new JFrame();
		jf.setSize(300,300);
		MenuTreeView mtv = new MenuTreeView();
		jf.getContentPane().add(mtv);
		jf.show();

	}
}

Jetzt müßte aber alles da sein. :?
 

atarifreak

Aktives Mitglied
Beni hat gesagt.:
Damit du nicht nur Zeichnen, sondern auch interagieren kannst, musst du auch einen TreeCellEditor implementieren (ist fast dasselbe wie der Renderer, nur wird der Editor an einer einzigen Stelle angezeigt).

Wow, Danke für den Tip. Der ist nicht einmal in meiner Sun-Literatur verzeichnet. Wie implementiere ich den denn? Direkt in einer Ableitung von JTree, DefaultMutableTreeNode oder auf das JPanel?

Danke!
 
B

Beni

Gast
Man muss nur die API lesen :roll:

Du machst dir eine neue Klasse, und kopierst erstmal den Quellcode deines Renderers. Dann implementierst du die noch fehlenden Methoden, die das Interface TreeCellEditor vorschreibt (Achtung: da kommen noch weitere Methoden von Superinterfaces hinzu).
 

atarifreak

Aktives Mitglied
Beni hat gesagt.:
Du machst dir eine neue Klasse, und kopierst erstmal den Quellcode deines Renderers. Dann implementierst du die noch fehlenden Methoden, die das Interface TreeCellEditor vorschreibt (Achtung: da kommen noch weitere Methoden von Superinterfaces hinzu).

Ich habe diese Klasse marginal erstellt und in jeder Methode eine Kontrollausgabe eingebaut, weil ich wissen wollte, ob er sie überhaupt anspringt. Leider Fehlanzeige. Ich habe die Zuweisung so durchgeführt:

Code:
setCellEditor(new TreeEditor());

Die Klasse selbst sieht so aus:
Code:
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.util.EventObject;
import javax.swing.event.*;

class TreeEditor implements TreeCellEditor
{
	TreeNodePanelAction ta;
	
	public Component getTreeCellEditorComponent(JTree tree, Object value, boolean selected, 
boolean expanded, boolean leaf, int row)
	{
		JPanel jpReturn = new JPanel();
		Component cReturn = jpReturn;
		
		DefaultMutableTreeNode dmt = (DefaultMutableTreeNode)value;
		try
		{
			CmNode cn = (CmNode)dmt;
			System.out.println("style:"+cn.getStyle());
			if (cn.getStyle() == 1)
			{
				ta = new TreeNodePanelAction(jpReturn);
				cReturn = ta;
			}
		}
		catch (Exception e)
		{ }
		System.out.println("Editor");
		return cReturn;
	}
	
	public void addCellEditorListener(CellEditorListener cel)
	{
		System.out.println("CellEditorListener");
	}
	
	public void cancelCellEditing()
	{
		System.out.println("cancelCellEditing");		
	}
	
	public Object getCellEditorValue()
	{
		System.out.println("getCellEditorValue");		
		return "getCellEditorValue";
	}
	
	public boolean isCellEditable(EventObject eo)
	{
		System.out.println("isCellEditable");
		return true;
	}
	
	public void removeCellEditorListener(CellEditorListener cel)
	{
		System.out.println("removeCellEditorListener");
		cel = null;
	}
	
	public boolean shouldSelectCell(EventObject eo)
	{
		System.out.println("shouldSelectCell");
		return (eo != null);
	}
	
	public boolean stopCellEditing()
	{
		System.out.println("stopCellEditing");
		return false;
	}
}

Ich erhalte keine der eingebauten Ausgaben in der Console. Kannst Du mir sagen, was da noch falsch ist? ???:L
 
B

Beni

Gast
Hm, auf gut Glück geraten: füg mal ein:
Code:
JTree tree = ... // dein Baum
tree.setEditable( true );
 

atarifreak

Aktives Mitglied
Beni hat gesagt.:
Hm, auf gut Glück geraten: füg mal ein:
Code:
JTree tree = ... // dein Baum
tree.setEditable( true );

Jau, Danke! :) Blöder Fehler ... :? Gibt es noch eine Möglichkeit, dass man nicht zig Mal auf die Node klicken muß, bis der Button klickbar ist, also die Bearbeitung sofort beim ersten Click eingeschaltet wird?
 
B

Beni

Gast
Bei "isCellEditable" immer true zurückgeben, ebenso bei "shouldSelectedCell". Ansonsten wüsste ich nichts (vielleicht postest du einen ausführbaren Code, damit man das angucken kann?).
 

atarifreak

Aktives Mitglied
Naja, das war eigentlich der komplette Code, und die Buttonbehandlung wäre ja nicht wirklich interessant dafür. Mich stört eben nur, dass der Button erst bedienbar wird, wenn das Tree erkannt hat, dass man editieren möchte. Der Knackpunkt wäre also, dem Tree mitzuteilen, dass man schon beim ersten Klick auf eine Node editieren möchte und nicht erst beim zweiten und zusätzlichen Warten. Geht sowas?
 

atarifreak

Aktives Mitglied
Habs herausgefunden:

Man muß die Methode "canEditImmediatly" von DefaultTreeCellEditor überschreiben, nachdem man eine Ableitung davon erstellt hat (welche ihrerseits die TreeCellEditor-Klasse im Constructor übernimmt).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
D Swing JButton.setenabled(true) funktioniert nicht AWT, Swing, JavaFX & SWT 12
B JButton ausblenden AWT, Swing, JavaFX & SWT 12
G JButton deaktivieren greift nicht AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben