Melhor forma de implementar dicas de ferramentas para JTree?
Pergunta
desde JTree & TreeModel não fornecem dicas reta out-of-the-box, o que você acha, qual seria a melhor maneira de ter as dicas específicas de itens para JTree?
Edit: (. Respondendo a minha própria pergunta depois)
@Zarkonnen: Obrigado pela ideia getTooltipText.
Eu descobri outra (talvez ainda um agradável bit) forma com substituindo DefaultTreeCellRenderer e pensado para compartilhá-lo:
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);
}
}
Solução
Veja getTooltipText em JTree. Isto deve permitir-lhe mostrar dicas de ferramentas, dependendo do que na árvore está sendo pairado sobre. (Do ler os docs, porém, você precisa registrar o JTree com o ToolTipManager.)
Outras dicas
Sim, você pode usar onMouseMoved
e, em seguida, usar um método (não me lembro o nome) que você em qual nó você tem mais diz. Se você receber null, obviamente, então você não está sobre um nó.
Ao lidar com subclasses específicas TreeNode
, com base em sua própria resposta e comentários, eu vim com uma interface para o meu TreeNode
de implementar.
Observe como vamos verificar se o value
é um intance de Tooltipable
na 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);
}