2008-11-07 10 views
18

desde JTree & TreeModel no proporciona información sobre herramientas nada más sacarlo de la caja, ¿cuál crees que sería la mejor forma de tener tooltips para JTree?¿La mejor manera de implementar tooltips para JTree?

Editar: (. Respondiendo a mi propia pregunta después)

@Zarkonnen: Gracias por la idea getTooltipText.

descubrí otra forma (quizá todavía un poco más bonito) con anulando DefaultTreeCellRenderer y pensado para compartirlo:

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

Su respuesta debe estar en una respuesta, por lo que la gente puede votar en ella. –

+2

DefaultTreeCellRenderer # getTreeCellRendererComponent se llama mucho y hacer esto demasiado pesado puede hacer que las cosas no funcionen como se esperaba. Al igual que la información sobre herramientas que debe aparecer, pero no. Anulación de JTree # getToolTipText (MouseEvent e) solo se llama cuando sea necesario y, como tal, ¡es una solución mucho mejor! – NomeN

+0

Cuando probé esto, la información sobre herramientas no apareció. Sin embargo, la respuesta de Zarkonnen funcionó. – Amber

Respuesta

14

Ver getTooltipText en JTree. Esto debería permitirle mostrar información sobre herramientas según lo que esté sobrevolando el árbol. (Sin embargo, lea los documentos, debe registrar el JTree con el ToolTipManager.)

+3

+1 para indicar que debe registrarse con 'ToolTipManager'. A pesar de que está en los documentos, es fácil pasar por alto. –

1

Sí, puede usar onMouseMoved y luego usar un método (no recuerdo el nombre) que le indique en qué nodo se encuentra encima. Si obtienes nulo, obviamente no estás sobre un nodo.

+1

Dado que no se menciona en ningún otro lugar: los métodos que vinculan la posición del mouse al nodo del árbol son 'getPathForLocation (int, int)' y 'getRowForLocation (int, int)'. Como sugieren otras respuestas, la implementación del renderizador personalizado o la anulación de 'getToolTipText (MouseEvent)' es más limpio que la adición de 'MouseListener'. –

0

Cuando se trata de subclases específicas TreeNode, en función de su propia respuesta y comentarios, se me ocurrió una interfaz para la implementación de mi TreeNode.

Nótese cómo, comprobamos si el value es un intance de Tooltipable en el 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); 
} 
Cuestiones relacionadas