实现JTree工具提示的最佳方法是什么?

由于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); } } 

请参阅JTree上的getTooltipText 。 这应该允许您显示工具提示,具体取决于树中hover的内容。 (但是,请阅读文档,您需要使用ToolTipManager注册JTree。)

是的,你可以使用onMouseMoved ,然后使用一个方法(我不记得名字)告诉你你在哪个节点。 如果你得到null,那么显然你不是在一个节点上。

在处理特定的TreeNode子类时,根据您自己的答案和注释,我想出了一个用于实现TreeNode的接口。

注意我们如何检查该value是否是TreeCellRendererTooltipable

 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); }