Question

depuis JTree & amp; TreeModel ne fournit pas d’info-bulles directement prêtes à l'emploi. Que pensez-vous? Quel serait le meilleur moyen d'avoir des info-bulles spécifiques à un élément pour JTree?

Modifier: (répondant à ma propre question par la suite.)

@Zarkonnen: Merci pour l'idée de getTooltipText.

J'ai découvert un autre moyen (peut-être encore un peu plus agréable) de surcharger DefaultTreeCellRenderer et j'ai pensé le partager:

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);
    }
}
Était-ce utile?

La solution

Voir getTooltipText sur JTree. Cela devrait vous permettre d'afficher des info-bulles en fonction de ce qui est survolé dans l'arborescence. (Lisez bien la documentation, vous devez enregistrer JTree avec ToolTipManager.)

Autres conseils

Oui, vous pouvez utiliser onMouseMoved , puis utiliser une méthode (je ne me souviens pas du nom) qui vous indique dans quel nœud vous êtes. Si vous obtenez la valeur null, vous n'êtes évidemment pas sur un nœud.

Lorsque vous traitez avec des sous-classes TreeNode spécifiques, en fonction de vos propres réponses et commentaires, j'ai proposé une interface que mon TreeNode à implémenter.

Remarquez comment nous vérifions si la valeur est une intance de Tooltipable dans le 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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top