【问题标题】:Best way to implement tooltips for JTree?为 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 的回答虽然有效。

标签: java swing tooltip jtree


【解决方案1】:

在处理特定的TreeNode 子类时,根据你自己的答案和cmets,我想出了一个接口供我的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);
}

【讨论】:

    【解决方案2】:

    请参阅 JTree 上的 getTooltipText。这应该允许您根据悬停在树中的内容显示工具提示。 (不过请阅读文档,您需要使用 ToolTipManager 注册 JTree。)

    【讨论】:

    • +1 表示您需要向ToolTipManager 注册。即使它在文档中,也很容易错过。
    【解决方案3】:

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

    【讨论】:

    • 由于其他地方没有提到:将鼠标位置链接到树节点的方法是getPathForLocation(int, int)getRowForLocation(int, int)。正如其他答案所建议的那样,实现自定义渲染器或覆盖 getToolTipText(MouseEvent) 比添加 MouseListener 更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2016-06-14
    • 1970-01-01
    • 2012-06-20
    • 2018-03-08
    相关资源
    最近更新 更多