Java 实现JTree工具提示的最佳方法?
由于JTree和TreeModel不提供开箱即用的工具提示,您认为,为JTree提供特定于项目的工具提示的最佳方式是什么 编辑:(之后回答我自己的问题。) @扎科宁:谢谢你的创意 我找到了另一种覆盖DefaultTreeCellRenderer的方法(也许还有一点更好),并想与大家分享:Java 实现JTree工具提示的最佳方法?,java,swing,tooltip,jtree,Java,Swing,Tooltip,Jtree,由于JTree和TreeModel不提供开箱即用的工具提示,您认为,为JTree提供特定于项目的工具提示的最佳方式是什么 编辑:(之后回答我自己的问题。) @扎科宁:谢谢你的创意 我找到了另一种覆盖DefaultTreeCellRenderer的方法(也许还有一点更好),并想与大家分享: public class JTreeWithToolTips { private static class OwnRenderer extends 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);
}
}
见JTree。这将允许您根据树中悬停的内容显示工具提示。(不过一定要阅读文档,你需要在ToolipManager中注册JTree。)是的,你可以在MouseMoved上使用
onMouseMoved
,然后使用一种方法(我不记得名称)告诉你你在哪个节点上。如果您得到null,那么显然您没有超过一个节点。在处理特定的TreeNode
子类时,根据您自己的回答和评论,我为我的TreeNode
实现了一个接口
请注意,我们是如何检查值
是否是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);
}
你的答案应该在答案中,这样人们就可以对它进行投票。DefaultTreeCellRenderer#GetTreeCellRenderer组件被称为很多组件,使其太重可能会使其无法按预期工作。比如应该显示但不显示的工具提示。重写JTree#gettooltipext(MouseEvent e)仅在需要时调用,因此是一个更好的解决方案!当我尝试此操作时,工具提示没有显示。Zarkonnen的答案还是有效的。因为在其他地方没有提到:将鼠标位置链接到树节点的方法是
getPathForLocation(int,int)
和getRowForLocation(int,int)
。正如其他答案所建议的那样,实现自定义呈现程序或覆盖gettooltipext(MouseEvent)
比添加MouseListener
+1更干净,因为您需要向ToolTipManager
注册。即使它在文档中,也很容易错过。