Лучший способ реализовать всплывающие подсказки для JTree? - PullRequest
18 голосов
/ 07 ноября 2008

, так как 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);
    }
}

Ответы [ 3 ]

15 голосов
/ 07 ноября 2008

См. getTooltipText на JTree. Это должно позволить вам показывать всплывающие подсказки в зависимости от того, над чем находится дерево. (Тем не менее, прочитайте документы, вам нужно зарегистрировать JTree в ToolTipManager.)

1 голос
/ 21 ноября 2009

Да, вы можете использовать onMouseMoved, а затем использовать метод (я не помню имени), который сообщает вам, на каком узле вы находитесь. Если вы получаете ноль, очевидно, что вы не находитесь над узлом.

0 голосов
/ 07 сентября 2017

При работе с конкретными TreeNode подклассами, основываясь на ваших собственных ответах и ​​комментариях, я придумал интерфейс для реализации TreeNode.

Обратите внимание, как мы проверяем, является ли value экземпляром Tooltipable в TreeCellRenderer:

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