Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch

nstrauch

Mitglied
Ich habe mit
Code:
JTree
einen Outliner gebaut.

Für "plain text" benutze ich als
Code:
TreeCellRenderer
ein
Code:
JTextArea
.
Hier funktioniert der automatische Zeilenumbruch problemlos.
Die nötigen Dimensionen des
Code:
JTextArea
werden in
Code:
getTreeCellRenderer(...)
wie folgt gesetzt:
Java:
rendererComponent.setSize(availableWidth, Short.MAX_VALUE);
int neededHeight = rendererComponent.getPreferredSize().height();
rendererComponent.setSize(availableWidth, neededHeight);
Beim Aufruf von
Code:
getPreferredSize()
berechnen Komponenten wie
Code:
JTextArea
die zur Darstellung ihres Inhaltes benötigte Fläche, nach Möglichkeit innerhalb der mit
Code:
setSize(...)
gegebenen Dimensionen.

(Diese Form benutzt z. B. auch BorderLayout beim Berechnen des Layouts.)


Mein Problem: Knoten mit html-text:

Code:
JTextArea
unterstützt kein html, darum benutze ich ein
Code:
JLabel
.
Normalerweise berechnet auch
Code:
JLabel
mit
Code:
getPreferredSize()
die von ihm benötigten Dimensionen, mit automatischen Zeilenumbrüchen im html-text.

(JLabel macht scheinbar nur mit html-Text automatische Zeilenumbrüche, in plain text nie.)

Doch hier funktioniert das nicht: egal was ich mache, es gibt keine automatischen Zeilenumbrüche.
(Es sei denn sie werden vom html-code verlangt, wie z. B. mit "<br>")

Aus irgend einem Grund kann das
Code:
JLabel
nicht sofort den korrekt benötigten Size errechnen.
Muss irgend etwas anderes vor dem Aufruf von
Code:
getPreferredSize()
gemacht werden?

(Layoutmanager scheinen den Vorgang öffter zu wiederholen, bis die korrekte Größe angegeben wird - was bei einer TreeCellRenderer-Component kaum möglich ist.)

- Bin für jede Hilfe und Gedankenanregung sehr dankbar! -

Habe in folgendem Beitrag schon mal versucht die Fragestellung um das
Code:
JLabel
zu isolieren:
http://www.java-forum.org/awt-swing-swt/136759-komponentenhoehe-html-inhalt-anpassen.html

Was passiert mit dem
Code:
JLabel
, bevor es sonst die korrekten benötigten Dimensionen berechnet?


Doch... vielleicht ist mein Ansatz beim Erzeugen eines
Code:
TreeCellRenderers
falsch?


Hier meine Testklasse, welche JTextArea und JLabel gegenüberstellt:
(JEditorPane oder JTextPane anstelle des JLabel führen zum gleichen Ergebnis)
Java:
public class LabelSizeTree extends JTree {
	
	/** Knoten, welcher sich eine Renderer-Component merkt. */
	static class CellRenderingTreeNode extends DefaultMutableTreeNode {
		Component renderingComponent;
		CellRenderingTreeNode(Component renderingComponent){
			this.renderingComponent = renderingComponent;
		}
		public Component getTreeCellRendererComponent() {
			return renderingComponent;
		}
	}
	
	
	static String cellsText = "Langer, langer langer InitialText. Braucht keine html-tags, sie werden später hinzugefügt.";
	static JLabel label = new JLabel("<html>"+cellsText+"</html>");
	static JTextArea textArea = new JTextArea(cellsText);
	
	
	LabelSizeTree(){
		super(mountNodes(label, textArea));
		setCellRenderer(new TreeCellRenderer(){
			public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
				JLabel dummyComponent = new  JLabel("Vergleich zwischen JLabel und JTextArea");
				if(value instanceof CellRenderingTreeNode)
					return ((CellRenderingTreeNode)value).getTreeCellRendererComponent();
				return dummyComponent;
			}
		});
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		label.setBorder(BorderFactory.createLineBorder(Color.green));
		textArea.setBorder(BorderFactory.createLineBorder(Color.green));
		createFrame();
	}
	
	
	void setTheTextOfLabel(){
		
		cellsText =   JOptionPane.showInputDialog("Enter a Text", cellsText);
		if(cellsText==null || cellsText.equals("")) return;
		
		label.setText("<html>"+cellsText+"</html>");
		textArea.setText(cellsText);
		
		resizeTheLabelAndTheTextArea();

	}
	
	void resizeTheLabelAndTheTextArea(){
		
		// Nehme die aktuelle Breite dieses JPanels (entspricht der des frames).
		int availableWidth = getSize().width - 50; // ziehe 30 ab wegen Einrückung der Knoten
		
		// Setze die zur Verfügung stehende Breite, sowie beliebige Höhe
		label.setSize(availableWidth, Short.MAX_VALUE);
		textArea.setSize(availableWidth, Short.MAX_VALUE);
			
		// In getPreferredSize() wird berechnet wieviel von der gegebenen 
		// Breite und Höhe für die Darstellung des Inhaltes benötigt wird.
		// Uns interessiert nur die Höhe.
		int calculatedLabelHeight = label.getPreferredSize().height;
		int calculatedTextAreaHeight = textArea.getPreferredSize().height;
		
		// Das label erhält die Breite des JPanel (this), und die Höhe die es bedarf.
		label.setBounds(0, 0, availableWidth, calculatedLabelHeight);
		textArea.setBounds(0, 0, availableWidth, calculatedTextAreaHeight);
		
		updateUI();
		repaint();
	}
	
	
	/** Hiermit lässt sich der Label-text ändern */
	ActionListener changeTextListener =
		new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				
				setTheTextOfLabel();
				
			}
		};
	
	/** Hiermit kann man die Höhe des Labels neu berechnen und setzen lassen.
	 *  Hat in diesem Beispiel keine Auswirkung mehr,
	 *  das label bleibt wie es ist... */
	ActionListener doLayoutListener =
		new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				
				resizeTheLabelAndTheTextArea();
				
			}
		};
	


	/** Baut einen Root-Knoten mit zwei Kindern, eins für ldas JLabel, eines für textArea auf. */
	static TreeNode mountNodes(JLabel label, JTextArea textArea){
		DefaultMutableTreeNode root = new DefaultMutableTreeNode();
		DefaultMutableTreeNode child1 = new CellRenderingTreeNode(new JLabel("JLabel mit html-text:"));
		DefaultMutableTreeNode childchild1 = new CellRenderingTreeNode(label);
		child1.insert(childchild1, 0);
		DefaultMutableTreeNode child2 = new CellRenderingTreeNode(new JLabel("JTextArea mit plain-text:"));
		DefaultMutableTreeNode childchild2 = new CellRenderingTreeNode(textArea);
		child2.insert(childchild2, 0);
		root.insert(child1, 0);
		root.insert(child2, 1);
		return root;
	}

	/** Bringt das JTree lediglich in ein Frame hinein, und zeigt es.
	 *  Änderungen der Größe des Frames lassen das JLabel und das JTextArea auch neu berechnen. */
	void createFrame(){

		final JButton changeTextButton = new JButton("Enter a new test-text");
		changeTextButton.addActionListener(changeTextListener);
		final JButton doLayoutButton = new JButton("Recalculate the sizes of the test-renderers");
		doLayoutButton.addActionListener(doLayoutListener);
		
		final JPanel panel = new JPanel();		
		panel.setLayout(new BorderLayout());
		panel.add(changeTextButton, BorderLayout.NORTH);
		panel.add(this, BorderLayout.CENTER);
		panel.add(doLayoutButton, BorderLayout.SOUTH);
		
		JFrame frame = new JFrame("LabelSizeTree");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Ändert man die Größe des frames,
		// wird die Höhe des labels hiermit auch neu berechnet
		frame.addComponentListener(new ComponentAdapter() {
			public void componentResized(ComponentEvent e) {
				resizeTheLabelAndTheTextArea();
			}
		});

		frame.add(panel);
		frame.pack();		
		frame.setVisible(true);
		
	}
	
	public static void main(String a[]){
		new LabelSizeTree();
	}
	
}
(ohne import-Anweisungen wegen der Übersichtlichkeit; kann doch sicher jeder selbst nachfügen?)
 

Kevin94

Top Contributor
Das Problem ist, das JLabel niemals einen automatischen Zeilenumbruch macht. Wenn du in einem JLabel einen Zeilenumbruch haben willst, must du ihn mit html erzwingen. Für dein Problem wäre JEditorPane wohl die besser passende Komponente.
 

nstrauch

Mitglied
Doch, doch, JLabel macht, wenn der Text zwischen <html> und </html> steht, automatische Zeilenumbrüche.

Das demonstriert mein Beispiel unter http://www.java-forum.org/awt-swing-swt/136759-komponentenhoehe-html-inhalt-anpassen.html
In dem Beispiel ist das Problem, dass das Resizing erst beim 2. Aufruf funktioniert: gleich nach dem neusetzen des Textes des JLabel ist er erstmal 1-Zeilig.

Benutzt man einen hinreichend klugen LayoutManager (wie BorderLayout), funktioniert es problemlos.

Doch bei einem TreeCellRenderer kann ich keinen LayoutManager verwenden, oder?
 

nstrauch

Mitglied
Vergaß zu erwähnen:
mit JEditorPane oder JTextPane bekomme ich, so wie ich es im Beispiel oben versuche, auch keinen automatischen Zeilenumbruch in html hin. (Gleiche Ergebnis wie mit JLabel.)
Warum nicht? Was kann ich anders machen?
 

Kevin94

Top Contributor
Nein, bei Renderen kann man keinen LayoutManager nutzten, der Sinn von Renderen ist möglichst schnell eine simple Komponente zu liefer, die extrem einfach aufgebaut ist. Deshalb erben sämtliche Renderer von Sun direkt von einer Komponente und überschreiben sämtliche am Zeichnen beteiligten Methoden, sodass sie extrem perfomant sind.
Ich kann nur empfehlen eine andere Komponente als JLabel zu verwenden.

[EDIT]Das überrascht mich jetzt.[/EDIT]
 

nstrauch

Mitglied
@bERt0r: stimmt, statt updateUI lieber TreeModel.nodeChanged (habe ich erst kürzlich gefunden).
Leider löst es das Problem auch nicht.

@Kevin94: versuche ich selbst sämtliche am Zeichnen beteiligte Methoden zu überschreiben, muss ich mich um alle Formattierungen selbst kümmern...
Wenn ich Renderer brauche die etwas mehr können, ist es dann nicht sinnvoll auch auf etwas komplexere Komponenten zurückzugreifen, welche das bereits bestens können?
 

nstrauch

Mitglied
:DGeschafft!! Mein TreeCellRenderer nimmt html-Text, und macht automatische Zeilenumbrüche.:D

???:LAllerdings - kann bitte jemand sagen, ob dies eine sinnvolle und zulässige Lösung ist?

Damit das benutzte JLabel seine Größe dann berechnet wenn ich es will, setze ich die Größe direkt an seinem View:

Java:
View view = (View)getClientProperty(BasicHTML.propertyKey);
view.setSize(maxWidth, Short.MAX_VALUE);

Ist es zulässig das View so zu benutzen, oder kann das in komplexeren Programmen zu unerwartetem Verhalten führen?

Sonst sieht eine funktionierende Lösung so aus:

Java:
/**
 * Ein Baum mit Knoten die html-Text enthalten und automatischem Zeilenumbruch haben,
 * mit einem JLabel als TreCellRenderer-Komponente.
 */
public class HtmlTree extends JTree {
	
	public static final String HTML_PREFIX = "<html>";
	public static final String HTML_SUFFIX = "</html>";
	
	/** Stellt den Knoteninhalt als html, mit automatischen Zeilenumbrüchen, dar. */
	static class HtmlTreeCellRenderer extends JLabel implements TreeCellRenderer {

		HtmlTreeCellRenderer(){
			setOpaque(true);
		}

		@Override
		public Component getTreeCellRendererComponent(JTree tree, Object value, 
													   boolean selected, boolean expanded,
													   boolean leaf, int row, boolean hasFocus) {
			
			// nehme den Text des Knotens 
			// und füge wenn nötig die Anfang- und Schluss-Tags für html hinzu
			String text = value.toString();
			if(!text.startsWith(HTML_PREFIX)) text = HTML_PREFIX + text + HTML_SUFFIX;
			setText(text);
			
			// setze den Hintergrund
			if(selected)
				if(hasFocus) setBackground(Color.GRAY);
				else setBackground(Color.LIGHT_GRAY);
			else setBackground(Color.WHITE);
			
			
		//  - SETZEN DER KNOTEN-BREITE - 
			
			// errechne die verfügbare Breite = (Breite des Baums) - (linker Einzug des Knotens)
			// ACHTUNG: wird JTree z. B. in ein ScrollPane gesetzt,
			//          verfügt es möglicherweise über beliebige Breite,
			//          dann sollte man die Breite anders berechnen.
			int maxWidth = tree.getWidth() - getNodeDeep((DefaultMutableTreeNode)value, 0)*21;
			// Wenn bereits eine gülige Breite vorhanden ist
			if(maxWidth>0){	
				// setze die Breite des View (welches den html-Inhalt rendert) auf die maximal erwünschte,
				// sowie auf die maximale Höhe 
				View view = (View)getClientProperty(BasicHTML.propertyKey);
				view.setSize(maxWidth, Short.MAX_VALUE);
				
			}
			
			return this;
		}
		
		/* Hilfsfunktion um die Tiefe eines Knotens zu seiner Wurzel auszurechnen. */
		private int getNodeDeep(DefaultMutableTreeNode node, int startDeep){
			 if(node.getParent()==null) return startDeep;
			 else return getNodeDeep((DefaultMutableTreeNode)node.getParent(), startDeep+1);
		}
		
		// Die folgenden Funktionen dürfen/müssen aus Performancegründen überschrieben werden. 
		@Override public void validate() {}
		@Override public void invalidate() {}
		@Override public void revalidate() {}
		@Override public void repaint(long tm, int x, int y, int width, int height) {}
		@Override public void repaint(Rectangle r) {}
		@Override public void repaint() {}
		@Override public void firePropertyChange(String propertyName, byte oldValue, byte newValue) {}
		@Override public void firePropertyChange(String propertyName, char oldValue, char newValue) {}
		@Override public void firePropertyChange(String propertyName, short oldValue, short newValue) {}
		@Override public void firePropertyChange(String propertyName, int oldValue, int newValue) {}
		@Override public void firePropertyChange(String propertyName, long oldValue, long newValue) {}
		@Override public void firePropertyChange(String propertyName, float oldValue, float newValue) {}
		@Override public void firePropertyChange(String propertyName, double oldValue, double newValue) {}
		@Override public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
		
	}

	HtmlTree(TreeNode rootNode){
		super(rootNode);
		setCellRenderer(new HtmlTreeCellRenderer());
		setEditable(true);
	}
	
	public static void main(String a[]){
		
		final HtmlTree htmlTree = new HtmlTree(mountTree(5));
		
		JFrame frame = new JFrame("HtmlTree");	
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.addComponentListener(new ComponentAdapter() {
			
			public void componentResized(ComponentEvent e) {
				
				// sammle alle sichtbaren Pfade
				TreePath[] paths = htmlTree.getPathBetweenRows(0, htmlTree.getRowCount());
				
				// Nimm das installierte DefaultTreeModel
				DefaultTreeModel model = (DefaultTreeModel)htmlTree.getModel();
				
				// Lass das TreeModel den Knoten aller sichtbaren Pfade bescheid geben, 
				// dass sich etwas geändert hat (in diesem Fall die Komponentengröße)
				for(TreePath tp : paths) model.nodeChanged((TreeNode)tp.getLastPathComponent());
				
			}
			
		});

		frame.getContentPane().add(htmlTree);
		frame.pack();		
		frame.setVisible(true);
		
	}
	
	/** Baut einen dummy-Baum auf. */
	public static DefaultMutableTreeNode mountTree(int childs){
		DefaultMutableTreeNode rootNode
			= new DefaultMutableTreeNode("Tripple-Click to enter a big, big text. "
										  + "Maybe with html-tags like <i>&lt;i&gt;</i> :-)");
		if(childs>0)
			for(int i=0; i<childs; i++)
				rootNode.add(mountTree((int)(Math.random()*childs)));
		return rootNode;
	}
	
}

Wenn irgendjemand mit mehr Ahnung zu den Tücken von Swing die absegnen kann, würde ich den Thread als "Beendet" markieren - ich glaub das macht man hier so?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTree TreeCellRenderer Panelgröße funzt net AWT, Swing, JavaFX & SWT 2
R JTree: TreeCellRenderer und Selektion eines Knoten AWT, Swing, JavaFX & SWT 10
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
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
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
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

Ähnliche Java Themen

Neue Themen


Oben