Swing [JTree] Selektierte Nodes nummerieren

lemming

Mitglied
hallo zusammen,
hab schon viel rumgesucht und auch schon einige sachen ausprobiert. jetzt wollt ich euch mal fragen ob ihr vielleicht auf anhieb wüsstet, wie man folgendes realisieren könnte:

mein jtree hat zum beispiel 3 nodes in form von jpanels+jlabels mit einer seiten-vorschau. selektierte seiten (nodes) erhalten einen farbigen rahmen in form eines TitledBorders mit einer zahl, welche die reihenfolge der selektion anzeigt:

TreeCellRenderer
Java:
			// Show a titled border - count selection and display it on each selected.
			if (XYTreeCellRenderer.this.selected) {
				panel.setBorder(BorderFactory.createTitledBorder(highlightBorder, String.valueOf(treeHandle.getSelectionCount()), TitledBorder.RIGHT, TitledBorder.DEFAULT_POSITION, new Font("Arial", Font.BOLD, 16), Color.BLACK));
			} else {
				panel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 1));
			}

das mit dem roten rahmen funktioniert natürlich. probleme hab ich nur mit der nummerierung der reihenfolge bei einer selektion. der obige text wird innerhalb einer paint() methode ausgeführt, welche sich innerhalb des panels befindet, welches für die darstellung der seitenvorschau zuständig ist.

der fehler zeigt sich dadurch, dass wenn ich zum beispiel die ersten drei seiten selektiere, die erste eine "1" bekommt - die zweite eine "3" und die erste zur "2" wird. siehe screenshot...

wie würdet ihr ansetzen? würd mich über tipps freuen!

gruß
 

Anhänge

  • sequence.jpg
    sequence.jpg
    18 KB · Aufrufe: 52

Michael...

Top Contributor
Entweder des TreeNode Objekt merkt sich selbst die Nummer oder Du hälst eine Liste vor mit der Du Nummer und Objekt mappen kannst.
So wie Du das machst, kann es sein, dass aufgrund irgendeines repaints bei alle selektierten Knoten die selbe Nummer (nämlich die Anzahl der selektierten Knoten) angezeigt wird.

lemming hat gesagt.:
der obige text wird innerhalb einer paint() methode ausgeführt
das hört sich gefährlich an. Du redest hier hoffenlich nich von einer überschriebenen paint einer Komponente?
 

lemming

Mitglied
hey michael,
danke für deine antwort. ich hatte das schon implementiert, dass sich jedes treeNode objekt beim selektieren eine variable namens "counter" mit dem wert aus treeHandle.getSelectionCount() merkt.

hat auch nichts geholfen, ich denke aber dass dein hinweis mit der paint() methode in die richtige richtung geht! das ist unschön aber wo wär dann der richtige platz innerhalb eines cellrenderes? zum beispiel um selektierten nodes einen border zu geben? wichtig hierbei, wo überhaupt hatt man zugriff auf die aktuell bzw. einzelnen nodes? in meinem fall werden ja immer gleich mehrere auf einmal aktualisiert ohne dass ich das steuern kann.

grüße
 

lemming

Mitglied
für mich scheint die thematik doch komplizierter zu sein als ich anfangs angenommen hatte. selbst wenn ich im TreeSelectionListener die zahl in form einer variable abspeichere und in der getTreeCellRendererComponent(...) versuche zu setzen, gehts nicht. sobald nodes wieder deselektiert werden, läuft es aus dem ruder...

danke soweit mal, werd das vorerst als nice-to-have feature zurückstellen. sollte ich noch ne lösung finden, werd ich das natürlich nachreichen.
 

Michael...

Top Contributor
Nicht gerade schön, aber es zeigt wie man da möglicher Weise vorgehen kann.
Hatte erst gedacht, man könnte das TreeSelectionModel nutzen, aber das Model scheint beim deselektieren einzelner Knoten die Reihenfolge zu ändern.
Hab's jetzt mal so gelöst, dass ich die selektierten Knoten entsprechend ihrer Selektionsreihenfolgen in eine Liste gesteckt habe, den Listenindex verwende für den Titel der Border.
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;

public class TreeSelectionCountDemo extends JFrame {
	
	private JTree tree;
	private ArrayList<DefaultMutableTreeNode> selectionList;
	
	public TreeSelectionCountDemo() {
		selectionList = new ArrayList<DefaultMutableTreeNode>();
		
		tree = new JTree();
		tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent e) {
				TreePath[] paths = e.getPaths();
				for (TreePath path : paths) {
				DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
					if (node.isLeaf()) {
						if (e.isAddedPath())
							selectionList.add(node);
						else
							selectionList.remove(node);
					}
				}
				actualizeSelectionList();
			}
		});
		
		tree.setCellRenderer(new BorderCellRenderer());
		this.getContentPane().add(new JScrollPane(tree));
	}
	
	private void actualizeSelectionList() {
		TreePath[] paths = tree.getSelectionModel().getSelectionPaths();
		if (paths==null) 
			selectionList.clear();
		else {
			ArrayList<DefaultMutableTreeNode> compareList = new ArrayList<DefaultMutableTreeNode>();
			for(TreePath path : paths) 
				compareList.add((DefaultMutableTreeNode)path.getLastPathComponent());
			
			for (int i=selectionList.size()-1; i>=0; i--) {
				DefaultMutableTreeNode node = selectionList.get(i);
				if (compareList.indexOf(node)<0)
					selectionList.remove(node);
			}
		}
		tree.repaint();
	}
	
	class BorderCellRenderer extends JLabel implements TreeCellRenderer {
		private TitledBorder titledBorder;
		private JLabel dummyNodeLabel, defaultLabel;
		
		public BorderCellRenderer() {
			Border border = BorderFactory.createLineBorder(Color.RED, 2);
			titledBorder = BorderFactory.createTitledBorder(border, "XXX", TitledBorder.RIGHT, TitledBorder.DEFAULT_POSITION, tree.getFont().deriveFont(Font.BOLD), Color.BLACK);
			defaultLabel = new JLabel();
			dummyNodeLabel = new JLabel();
			dummyNodeLabel.setBorder(titledBorder);
		}
		
		public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
			DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
			String labelText = node.getUserObject().toString();
    		if (!leaf) {
    			defaultLabel.setText(labelText);
    			return defaultLabel;
    		}
    		
    		this.setText(labelText);
    		
    		if (selected) {
    			titledBorder.setTitle(String.valueOf(selectionList.indexOf(node)+1));
    	    	this.setBorder(titledBorder);
    	    	return this;
    		}
    		
    		this.setBorder(null);
    		this.dummyNodeLabel.setText(labelText);
    		this.setPreferredSize(this.dummyNodeLabel.getPreferredSize());
    		
    		return this;
		}
	}
	
	public static void main(String[] args) {
		JFrame frame = new TreeSelectionCountDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
Das entscheidende ist das was im TreeSelectionListener passiert (Zeile 28 bis 64) bin mir nicht sicher ob es in allen möglichen Konstellationen so sauber läuft.
 

lemming

Mitglied
Hallo Michael,
sorry für die sehr verspätete Rückmeldung. Vielen Dank nochmal für die Mühe! Leider machen manche Konstellationen weiterhin Probleme, speziell beim deselektieren und erneuten selektieren. Hab die Anzeige der Zahlen jetzt erstmal begraben..
Aber ich denke für andere die siche evtl. mit einer ähnliche Thematik beschäftigen, ist der Thread trotzdem hilfreich!

Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
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
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


Oben