实现JTree工具提示的最佳方式是什么?
问题描述:
自JTree & TreeModel不直接提供开箱即用的工具提示,您如何看待如何为JTree提供特定于物品的工具提示?实现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);
}
}
答
是的,您可以使用onMouseMoved
然后使用一个方法(我不记得名称)告诉你在哪个节点中过度。如果你得到null,显然那么你不在节点上。
答
当处理特定的TreeNode
子类时,根据您自己的回答和意见,我想出了一个用于实现我的TreeNode
的接口。
注意我们如何检查value
是Tooltipable
在TreeCellRenderer
的intance:
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);
}
你的答案应该是一个答案,使人们可以在其上进行表决。 – 2008-11-07 15:28:18
DefaultTreeCellRenderer#getTreeCellRendererComponent被称为很多,并使这个太重量级可以使东西不能按预期工作。就像应该显示的工具提示一样,但不要。覆盖JTree#getToolTipText(MouseEvent e)仅在需要时调用,因此是更好的解决方案! – NomeN 2013-07-11 16:43:03
当我尝试这个工具提示没有出现。 Zarkonnen的答案虽然工作。 – Amber 2016-11-14 22:08:36