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

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

问题描述:

自JTree & TreeModel不直接提供开箱即用的工具提示,您如何看待如何为JTree提供特定于物品的工具提示?实现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); 
    } 
} 
+6

你的答案应该是一个答案,使人们可以在其上进行表决。 – 2008-11-07 15:28:18

+2

DefaultTreeCellRenderer#getTreeCellRendererComponent被称为很多,并使这个太重量级可以使东西不能按预期工作。就像应该显示的工具提示一样,但不要。覆盖JTree#getToolTipText(MouseEvent e)仅在需要时调用,因此是更好的解决方案! – NomeN 2013-07-11 16:43:03

+0

当我尝试这个工具提示没有出现。 Zarkonnen的答案虽然工作。 – Amber 2016-11-14 22:08:36

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

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

当处理特定的TreeNode子类时,根据您自己的回答和意见,我想出了一个用于实现我的TreeNode的接口。

注意我们如何检查valueTooltipableTreeCellRenderer的intance:

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