سؤال

ومنذ 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top