为 JTree 实现工具提示的最佳方式?
Posted
技术标签:
【中文标题】为 JTree 实现工具提示的最佳方式?【英文标题】:Best way to implement tooltips for JTree? 【发布时间】:2010-09-21 06:57:20 【问题描述】:由于 JTree 和 TreeModel 不直接提供开箱即用的工具提示,您认为,为 JTree 提供特定于项目的工具提示的最佳方式是什么?
编辑:(之后回答我自己的问题。)
@Zarkonnen:感谢 getTooltipText 的想法。
我发现了另一种(可能还是更好一点)覆盖 DefaultTreeCellRenderer 的方法,并想分享它:
public class JTreeWithToolTips
private static class OwnRenderer extends DefaultTreeCellRenderer
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean sel, boolean expanded, boolean leaf, int row,
boolean hasFocus)
setToolTipText("foobar" + row);
return super.getTreeCellRendererComponent(tree, value, sel,
expanded, leaf, row, hasFocus);
public static void main(String[] args)
JTree tree = new JTree(new Object[] "foo", "bar", "foobar" );
tree.setCellRenderer(new OwnRenderer());
ToolTipManager.sharedInstance().registerComponent(tree);
JFrame frame = new JFrame();
frame.getContentPane().add(tree);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
【问题讨论】:
您的答案应该包含在答案中,以便人们对其进行投票。 DefaultTreeCellRenderer#getTreeCellRendererComponent 被调用了很多,使这个太重可能会使事情无法按预期工作。就像应该显示但不显示的工具提示一样。覆盖 JTree#getToolTipText(MouseEvent e) 仅在需要时调用,因此是更好的解决方案! 当我尝试这个时,工具提示没有出现。 Zarkonnen 的回答虽然有效。 【参考方案1】:在处理特定的TreeNode
子类时,根据你自己的答案和cmets,我想出了一个接口供我的TreeNode
实现。
请注意我们如何检查value
是否是TreeCellRenderer
中Tooltipable
的实例:
public static interface Tooltipable
public String getToolTip();
public static class TheNode extends DefaultMutableTreeNode implements Tooltipable
private String shortDesc, longDesc;
public TheNode(String shortDesc, String longDesc)
super();
this.shortDesc = shortDesc;
this.longDesc = longDesc;
@Override
public String getToolTip()
return longDesc;
@Override
public String toString()
return shortDesc;
public static class TheModel extends DefaultTreeModel
public TheModel()
super(new TheNode("Root", "The base of everything"));
TheNode root = (TheNode)getRoot();
root.add(new TheNode("Second", "I am a number two"));
TheNode node = new TheNode("Third", "Another one bites the dust");
root.add(node);
node.add(new TheNode("Last", null)); // No tooltip for this one
public static class TreeTooltipRenderer extends DefaultTreeCellRenderer
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus)
if (value instanceof Tooltipable)
setToolTipText(((Tooltipable)value).getToolTip());
return super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
public static void main(String[] args)
JFrame frame = new JFrame();
frame.setBounds(100, 100, 300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTree tree = new JTree(new TheModel());
ToolTipManager.sharedInstance().registerComponent(tree);
tree.setCellRenderer(new TreeTooltipRenderer());
frame.add(new JScrollPane(tree), BorderLayout.CENTER);
frame.setVisible(true);
【讨论】:
【参考方案2】:请参阅 JTree 上的 getTooltipText。这应该允许您根据悬停在树中的内容显示工具提示。 (不过请阅读文档,您需要使用 ToolTipManager 注册 JTree。)
【讨论】:
+1 表示您需要向ToolTipManager
注册。即使它在文档中,也很容易错过。【参考方案3】:
是的,您可以使用onMouseMoved
,然后使用一种方法(我不记得名称)告诉您您在哪个节点结束。如果你得到 null,那么显然你没有超过一个节点。
【讨论】:
由于其他地方没有提到:将鼠标位置链接到树节点的方法是getPathForLocation(int, int)
和getRowForLocation(int, int)
。正如其他答案所建议的那样,实现自定义渲染器或覆盖 getToolTipText(MouseEvent)
比添加 MouseListener
更干净。以上是关于为 JTree 实现工具提示的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章
在 microsoft access 中提示报告参数的最佳方式