简体   繁体   English

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

[英]Best way to implement tooltips for JTree?

since JTree & TreeModel don't provide tooltips straight out-of-the-box, what do you think, what would be the best way to have item-specific tooltips for JTree? 由于JTree和TreeModel不提供开箱即用的工具提示,您如何看待,为JTree提供特定于项目的工具提示的最佳方法是什么?

Edit: (Answering my own question afterwards.) 编辑:(之后回答我自己的问题。)

@Zarkonnen: Thanks for the getTooltipText idea. @Zarkonnen:感谢getTooltipText的想法。

I found out another (maybe still a bit nicer) way with overriding DefaultTreeCellRenderer and thought to share it: 我发现了覆盖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);
    }
}

See getTooltipText on JTree. 请参阅JTree上的getTooltipText This should allow you to show tooltips depending on what in the tree is being hovered over. 这应该允许您根据树中悬停的内容显示工具提示。 (Do read the docs though, you need to register the JTree with the ToolTipManager.) (但是,请阅读文档,您需要使用ToolTipManager注册JTree。)

Yeah, you can use onMouseMoved and then use a method (I don't remember the name) that tells you in which node you are over. 是的,你可以使用onMouseMoved ,然后使用一个方法(我不记得名字)告诉你你在哪个节点。 If you get null, obviously then you are not over a node. 如果你得到null,那么显然你不是在一个节点上。

When dealing with specific TreeNode subclasses, based on your own answer and comments, I came up with an interface for my TreeNode to implement. 在处理特定的TreeNode子类时,根据您自己的答案和注释,我想出了一个用于实现TreeNode的接口。

Notice how we check if the value is an intance of Tooltipable in the TreeCellRenderer : 注意我们如何检查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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM