أفضل طريقة لتنفيذ تلميحات لJTree؟
سؤال
ومنذ JTree وTreeModel لا توفر تلميحات مباشرة من خارج المربع، ما رأيك، ما يمكن أن يكون أفضل وسيلة لتلميحات البند محددة ل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);
}
}
المحلول
وانظر <لأ href = "http://docs.oracle.com/javase/7/docs/api/javax/swing/JTree.html#getToolTipText(java.awt.event.MouseEvent)" يختلط = "نوفولو noreferrer "> getTooltipText على JTree. هذا يجب أن تسمح لك لإظهار تلميحات اعتمادا على ما في شجرة ويجري حلقت فوق. (لا تقرأ مستندات الرغم من ذلك، تحتاج إلى تسجيل JTree مع ToolTipManager).
نصائح أخرى
نعم، يمكنك استخدام onMouseMoved
ومن ثم استخدام أسلوب (لا أتذكر الاسم) تخبرك في العقدة التي كنت أكثر. إذا كنت تحصل على باطل، من الواضح فأنت لم تنته عقدة.
عند التعامل مع الفئات الفرعية TreeNode
محددة، على أساس الإجابة الخاصة بك والتعليقات، وخطرت لي واجهة لبلدي TreeNode
لتنفيذها.
لاحظ كيف يمكننا معرفة ما اذا كان value
هو intance من Tooltipable
في 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);
}