JTree & JComboBox - Elemente übers Fenster hinaus anzeigen

speedy_g

Mitglied
Hi,


Also folgendes Problem - weil ich grad nicht weiß, wie sich das nennt, mal eine etwas laienhafte Beschreibung. Wenn man z.B. in Eclipse in einer Baumanzeige (z.B. bei den Packages) ist oder z.B. (mal nicht Java) im Windows-Explorer links in der Ordneransicht und der aktuelle Eintrag wird durch die Fensterbegrenzung rechts abgeschnitten - wenn ich nun mit der Maus drüber gehe, dann wird die Anzeige für diesen Eintrag über das Fenster hinaus verlängert.

Wie schalte ich das beim JTree ein ? Ich bin der Meinung in C# oder der MVC war das nur ein "enable", was ich irgendwo setzen mußte - aber im JTree will sich nichts passendes von mir finden lassen.


Und jetzt zur JComboBox - genau das verhalten hätte ich auch gerne in der aufgeklappten ComboBox - also wenn die Einträge zu lang sind, daß mir dann beim Rüberfahren mit der Maus die Einträge komplett "verlängert" angezeigt werden. Wie kann ich das da hinbekommen ? (vermutlich hier nur mit nem Tooltip ? - aber wie bekomme ich zu der Zeit an die Stelle ein Tooltip und immer exakt über den aktuellen Eintrag ?)


MFG
speedy
 

KrokoDiehl

Top Contributor
Hallo.
Also für einen JTree ist mir hier eine derartige Funktionalität (außer der Umweg über einen Tooltip) nicht bekannt. Das Darstellen der Einträge im Tree übernimmt ein Renderer (TreeCellRenderer (Java Platform SE 6)). Hier könnte man mal probieren einen eigenen zu setzen und mit seiner Größe herumzuspielen, wenn der Eintrag selektiert ist.
Könnte etwas knifflig werden :)

Einen Tooltip im JTree musst du auch über den Renderer setzen, das sieht dann etwa wie folgt aus:
Java:
public Component getTreeCellRendererComponent(...)
{
    //... Render-Komponente holen

    comp.setTooltTip( value.toString() );
    return comp;
}

Bei einer JComboBox ist es halt so, dass das Popup der ComboBox so eingestellt wird, dass es so breit ist, wie die Combobox selbst. Man müsste also bei der Combobox selbst schauen, ob man an ihr Popup herankommt oder ein eigenes setzen kann, damit man hier mit der Größe arbeiten kann.
Vielleicht geht es aber auch hier über einen Renderer, denn die Combobox hat die Methode
Code:
setRenderer()
.
 

speedy_g

Mitglied
Ja ein Tooltip - wäre halt die Workaroundvariante, aber nicht die schöne. :) Kann ich einem Tooltip eine Position zuweisen, so daß ich es exakt über den Eintrag legen könnte ?

Aber selbst das möchte er bei mir nicht anzeigen.

Ich mach folgendes im getTreeCellRendererComponent:

Java:
Component component = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
        
((JComponent)component).setToolTipText( value.toString() );

return component;


MFG
speedy
 

KrokoDiehl

Top Contributor
Die Position vom Tooltip bestimmt der Mauscursor. Ich habe außer dem Standardzeugs noch nichts mit Tooltips gemacht um zu schauen, ob und was man hier alles modifizieren kann.
Jede JComponent hat z.B. die Methode
Code:
createToolTip()
, vielleicht kann man durch überschreiben dieser mehr erreichen?

Ach so, und bei JTrees muss man folgende Zeile aufrufen (warum auch immer):
Java:
ToolTipManager.sharedInstance().registerComponent( myJTree );
 

speedy_g

Mitglied
Also das "normale" ToolTip anzeigen funktioniert jetzt.

Jetzt wäre natürlich eine Positionierung genau beim/über/auf dem jeweiligen Eintrag noch ganz nett.

Das mit dem createToolTip funktioniert nicht, weil in dem jedesmal ein neues ToolTip erstellt wird und ein Setzen der Position wird einfach mißachtet/überschrieben.

Jetzt hab ich rausgefunden, daß die Componente JTree selber dafür zuständig ist, wo das ToolTip plaziert wird - also die Methode mal in der Initialisierung überschrieben.

Java:
						jTree = new JTree(treeModel)
						{
							public Point getToolTipLocation(MouseEvent e)
							{
								Component component = this.getComponentAt( e.getPoint() );
								
							    return component.getLocation();
							}
						};

Funktioniert soweit, daß das ToolTip jetzt immer an Position 0,0 angezeigt wird, da component.getLocation() immer für x und y 0 zurück gibt. (das scheint das JTree-Objekt zu sein, was da zurück kommt)

Jetzt ist natürlich die Frage - wie bekomme ich dem JTree die wirkliche Position des aktuellen Nodes entlockt ? - also beginnend nach dem Icon vom Node.


MFG
speedy
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Hallo speedy,

die Methode "getRowForLocation(int x, int y)" kann dir sicher weiterhelfen:
Java:
public Point getToolTipLocation(final MouseEvent event) {
    int xm = event.getX();
    int ym = event.getY();
    int row = getRowForLocation(xm, ym);
    TreeNode value = (TreeNode) getPathForRow(row).getLastPathComponent();
    JLabel comp = (JLabel) getCellRenderer().getTreeCellRendererComponent(
            this, value, false, false, value.isLeaf(), row, false);
    Point loc = getRowBounds(row).getLocation();
    loc.x += comp.getIcon().getIconWidth();
    loc.x += comp.getIconTextGap();
    return loc;
}
Gruß,
André
 
Zuletzt bearbeitet:

speedy_g

Mitglied
Cool, das funktioniert. ;)

Jetzt wollte ich das bei der ComboBox genauso machen. Einmal also das getListCellRendererComponent überschrieben, um den ToolTip zu setzen - funktioniert. Ein getToolTipLocation hat die ComboBox auch. Aber die ComboBox hat kein getRowForLocation oder ähnliches, soweit ich es gesehen habe.

Wie kann ich also bei der ComboBox den Index für eine bestimmte Mausposition rausbekommen ?


MFG
speedy
 

speedy_g

Mitglied
Hi,

das ist ja im Prinzip das, was ich haben möchte. Aber ich habe trotzdem mal versucht mit Hilfe der Sourcen die eigene Variante (den normalen ToolTips eine andere Location zu geben) zu erweitern.

Aber irgendwo ist da ein Denkfehler drin.

Jenes getToolTipLocation ist in "MyComboBox".

Java:
	public Point getToolTipLocation(MouseEvent mouseEvent)
	{
		Point location = null;
		
		if(isPopupVisible())
		{

			//MyComboBoxUI habe ich auch noch erstellt, aber implementiert nur die Methode getPopup(), die das
			//vorhandene popup-Objekt zurück gibt
			MyComboBoxUI myComboBoxUI = (MyComboBoxUI)getUI();
						
			if(myComboBoxUI != null)
			{
				
				ComboPopup comboPopup = myComboBoxUI.getPopup();
				
				if(comboPopup != null)
				{
					JList list = comboPopup.getList();
				
					if(list != null)
					{
				        JScrollPane jsp = (JScrollPane)SwingUtilities.getAncestorOfClass(JScrollPane.class, this);

				        if(jsp != null)
				        {
				        	Point p;
//							p = SwingUtilities.convertPoint(jsp, mouseEvent.getX(), mouseEvent.getY(), list);
							p = mouseEvent.getPoint();
							
							int index = list.locationToIndex( p );
							
							System.out.println( "index = "+ index );

							if(index > -1)
							{
								location = list.getCellBounds( index, index ).getLocation();
							}
				        }
					}
				}
			}
		}
		
		if(location == null)
		{
			System.out.println( "location = null" );
			
			location = super.getToolTipLocation( mouseEvent );
		}

		
		return location;
		
	}

In meiner Test-ComboBox sind 4 Elemente.

Im aufgeklappten Zustand - wenn ich mit der Maus über den Bereich gehe, der auch im zugeklappten Zustand da ist (also halt die ComboBox zugeklappt) - dann wird mir index=0 zurück gegeben. Wenn ich auf das Popup - also den aufgeklappten Bereich - gehe, dann wird mir index=1 zurückgegeben, wenn ich den Bereich "betrete". Danach wird die Methode nicht mehr aufgerufen - es wird also weder ein neuer Index noch ein "location=null" ausgegeben. (bzw. - solange ich im ersten Eintrag bin, wird mir manchmal auch öfter noch ein index=1 ausgegeben - aber ab dem 2. Eintrag dann definitiv nichts mehr) Ich hatte auch immer nach den "if != null" - er wird also auch nicht irgendwo vorher gestoppt, weil irgendwas null ist.


Wenn ich die Variante mit dem "convertPoint" nehme, dann wird mir der ToolTip weiterhin immer unter der Maus angezeigt. Wenn ich einfach nur den Punkt aus dem Mausevent nehme, dann wird mir in der ComboBox der ToolTip genau über der ComboBox mit dem Startpunkt "links oben in der Ecke" angezeigt, weil er nen Punkt 0,0 errechnet wird - das ist aber auch nicht zentriert (also auf der y Achse) über der Schrift und wenn ich das erste Mal in den aufgeklappten Bereich wechsel, dann wird mir auch der ToolTip "links oben in der Ecke" als Startpunkt vom aufgeklappten Bereich angezeigt* - also auch nicht zentriert über dem ersten Eintrag. Wenn ich dann zum zweiten, dritten etc. Eintrag gehe, wird der richtige ToolTip wieder unterhalb der Maus angezeigt und wenn ich dann zum ersten Eintrag gehe, wird der ToolTip auch unterhalb angezeigt.


*Ich bin mir nicht wirklich sicher, ob er da schon wirklich weiß, daß er über dem ersten Eintrag ist - es wird zwar index=1 ausgegeben, aber ich bin zu dem Zeitpunkt mit der Maus noch so halb (also auf dem Rand) in der ComboBox und noch nicht im aufgeklappten Bereich. Wenn ich tiefer im aufgeklappten Bereich bin, dann wird der ToolTip vom ersten Eintrag auch nochmal unter der Maus angezeigt.



Jetzt kann man auf der verlinkten Seite von Andre ja auch lesen, daß wenn man in einer ComboBox auch für jeden Eintrag ein ToolTip haben möchte, daß man dann im MyComboBoxUI eine Klasse MyComboPopup erstellen und im createPopup zurück geben soll und im Konstruktor vom MyComboPopup deren ViewToolTip.Register aufrufen soll. Also habe ich im Konstruktor mal das ToolTipManager.sharedInstance().registerComponent( list ); aufgerufen und auch ein getToolTipLocation in das MyComboPopup eingebaut. Der Konstruktor wird auf gerufen, aber das getToolTipLocation später dann nicht.



MFG
speedy
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JTree Node mit Text plus JComboBox AWT, Swing, JavaFX & SWT 10
G JTree in JComboBox 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
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
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