2008-11-07 27 views
18

vì JTree & TreeModel không cung cấp chú giải công cụ thẳng ra khỏi hộp, bạn nghĩ gì, cách tốt nhất để có chú giải công cụ cụ thể cho JTree là gì?Cách tốt nhất để triển khai chú giải công cụ cho JTree?

Edit: (. Trả lời câu hỏi của riêng tôi sau đó)

@Zarkonnen: Cảm ơn ý tưởng getTooltipText.

tôi phát hiện ra khác (có lẽ vẫn còn một chút đẹp hơn) chiều với trọng DefaultTreeCellRenderer và nghĩ để chia sẻ nó:

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); 
    } 
} 
+6

câu trả lời của bạn phải ở trong một câu trả lời, để mọi người có thể bình chọn trên đó. –

+2

DefaultTreeCellRenderer # getTreeCellRendererComponent được gọi là rất nhiều và làm điều này quá nặng có thể làm cho công cụ không hoạt động như mong đợi. Giống như các chú giải công cụ sẽ hiển thị, nhưng không hiển thị. Ghi đè JTree # getToolTipText (MouseEvent e) chỉ được gọi khi cần thiết và như vậy là một giải pháp tốt hơn nhiều! – NomeN

+0

Khi tôi thử công cụ này, chú giải công cụ không hiển thị. Câu trả lời của Zarkonnen có hiệu quả. – Amber

Trả lời

14

Xem getTooltipText trên JTree. Điều này sẽ cho phép bạn hiển thị chú giải công cụ tùy thuộc vào những gì trong cây đang được di chuột qua. (Do đọc tài liệu, bạn cần phải đăng ký JTree với ToolTipManager.)

+3

+1 để lưu ý rằng bạn cần đăng ký với 'ToolTipManager'. Mặc dù nó nằm trong tài liệu, rất dễ bỏ sót. –

1

Vâng, bạn có thể sử dụng onMouseMoved và sau đó sử dụng một phương pháp (Tôi không nhớ tên) cho bạn biết bạn đang ở đâu kết thúc. Nếu bạn nhận được null, rõ ràng sau đó bạn không phải là trên một nút.

+1

Vì nó không được đề cập ở đâu đó: các phương thức liên kết vị trí chuột với nút cây là 'getPathForLocation (int, int)' và 'getRowForLocation (int, int)'. Theo đề xuất của các câu trả lời khác, việc triển khai trình kết xuất tùy chỉnh hoặc ghi đè 'getToolTipText (MouseEvent)' là gọn gàng hơn việc thêm một 'MouseListener'. –

0

Khi xử lý các lớp con TreeNode cụ thể, dựa trên câu trả lời và nhận xét của riêng bạn, tôi đã đưa ra một giao diện cho TreeNode để triển khai.

Chú ý cách chúng tôi kiểm tra xem value là một intance của Tooltipable trong 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); 
} 
Các vấn đề liên quan