Re: tooltips for Jtree nodes
Thomas Fritsch wrote:
Brandon McCombs wrote:
I have a JTree with a custom Node class. The jtree represents an LDAP
structure so container nodes can contain varying numbers of children.
I want to show the children count in a tooltip and I found code online
that shows how to do this however I thought it was supposed to
change/update the tooltip even when adjacent nodes had the same number
of children and therefore the same tooltip text but that isn't the case.
If I hover the mouse over a node in the middle of the tree and move
the cursor up 5 nodes and all 5 nodes have 0 children then the same
tooltip is displayed for each one but the tooltip is in the *same*
location too. And that location is the location that the first tooltip
appeared in for the first node the mouse was on. Is there any way for
the tooltip to "follow" the node that the cursor is on?
You didn't say how you defined the tooltip for your JTree. But from your
description I assume you called setToolTipText(String) on your JTree.
Instead of this you should override the getToolTipText(MouseEvent)
method of your TreeCellRenderer. It is then the responsibility of that
method to return a tooltip depending on the x/y position of the
MouseEvent or depending on other things.
To understand why this will work, you might look into the source code of
JTree#getTooltipText(MouseEvent).
I tried your alternative idea and it behaves the same way as what I
already have in that tooltips that have the same text do not get redrawn
but instead all tooltips beyond the first that share the first's text
use the first's tooltip and so the tooltip doesn't move as the cursor
moves over subsequent nodes.
As for what I already had, I was overriding getToolTipText(MouseEvent e)
within my tree class using the following:
public String getToolTipText(MouseEvent e) {
Object tip = null;
TreePath path = getPathForLocation(e.getX(), e.getY());
if (path != null) {
tip = path.getLastPathComponent();
}
if (tip == null)
return null;
int s = ((Node)tip).getSubs();
if ( ((Node)tip).getIsUpdated() )
return s + " children";
else
return "Unknown children"
This seems to be very similar, if not exactly the same, as what you
suggested in this post except you mention to use the method above in my
TreeCellRenderer. By doing that would tooltips that have the same text
be redrawn instead of using the first tooltip that has the same text?
thanks
}