Name: vi73552 Date: 07/06/99
I have a tree MyTree derived from swing JTree. I implemented
ToolTips which are displayed right over the tree node text,
specific to each node.
The mouse is over the node, the ToolTip si displayed. When the
mouse is moved, the ToolTip disappears, shows up again,
disappears, shows up again, etc.
This is contrary to the common ToolTip behavior where the
ToolTips do not disappear upon mouse move.
The following program demonstrates the ToolTip behavior if the
ToolTip location is not changed (i.e. the ToolTips don't
disappear):
>>>>>>>>>> Start Test Program MyTree1.java <<<<<<<<<<<<<<<<<<<<
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class MyTree1 extends JTree {
public MyTree1() {
super();
ToolTipManager.sharedInstance().registerComponent(this);
}
public String getToolTipText(MouseEvent event) {
if (event != null) {
Point p = event.getPoint();
int selRow = getRowForLocation(p.x, p.y);
TreeCellRenderer r = getCellRenderer();
if (selRow != -1 && r != null) {
TreePath path = getPathForRow(selRow);
Object lastPath = path.getLastPathComponent();
Component rComponent = r.getTreeCellRendererComponent(this,
lastPath,
isRowSelected(selRow),
isExpanded(selRow),
getModel().isLeaf(lastPath),
selRow,
true);
if (rComponent instanceof JLabel) {
return ((JLabel)rComponent).getText();
}
}
}
return null;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().add(new MyTree1());
f.pack();
f.setSize(new Dimension(200,200));
f.show();
}
}
>>>>>>>>>> End Test Program MyTree1.java <<<<<<<<<<<<<<<<<<<<
The following program demonstrates the buggy ToolTip behavior
if the ToolTip location is changed as described:
>>>>>>>>>> Start Test Program MyTree2.java <<<<<<<<<<<<<<<<<<<<
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class MyTree2 extends JTree {
public MyTree2() {
super();
ToolTipManager.sharedInstance().registerComponent(this);
}
public Point getToolTipLocation(MouseEvent event) {
if (event!=null) {
Point p = event.getPoint();
int selRow = getRowForLocation(p.x, p.y);
TreeCellRenderer r = getCellRenderer();
if (selRow != -1 && r != null) {
TreePath path = getPathForRow(selRow);
Object lastPath = path.getLastPathComponent();
Component rComponent = r.getTreeCellRendererComponent(this,
lastPath,
isRowSelected(selRow),
isExpanded(selRow),
getModel().isLeaf(lastPath),
selRow,
true);
if (rComponent instanceof JLabel) {
Rectangle pathBounds = getPathBounds(path);
Point toolTipLocation = new Point(pathBounds.x, pathBounds.y);
JLabel label = (JLabel)rComponent;
toolTipLocation.x += label.getIcon().getIconWidth() + label.getIconTextGap();
return toolTipLocation;
}
}
}
return null;
}
public String getToolTipText(MouseEvent event) {
if (event != null) {
Point p = event.getPoint();
int selRow = getRowForLocation(p.x, p.y);
TreeCellRenderer r = getCellRenderer();
if (selRow != -1 && r != null) {
TreePath path = getPathForRow(selRow);
Object lastPath = path.getLastPathComponent();
Component rComponent = r.getTreeCellRendererComponent(this,
lastPath,
isRowSelected(selRow),
isExpanded(selRow),
getModel().isLeaf(lastPath),
selRow,
true);
if (rComponent instanceof JLabel) {
return ((JLabel)rComponent).getText();
}
}
}
return null;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().add(new MyTree2());
f.pack();
f.setSize(new Dimension(200,200));
f.show();
}
}
>>>>>>>>>> End Test Program MyTree2.java <<<<<<<<<<<<<<<<<<<<
For a solution to the bug, look at the Work Around.
(Review ID: 85132)
======================================================================