2008-11-07 115 views
18

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

你的答案應該是一個答案,使人們可以在其上進行表決。 – 2008-11-07 15:28:18

+2

DefaultTreeCellRenderer#getTreeCellRendererComponent被稱爲很多,並使這個太重量級可以使東西不能按預期工作。就像應該顯示的工具提示一樣,但不要。覆蓋JTree#getToolTipText(MouseEvent e)僅在需要時調用,因此是更好的解決方案! – NomeN 2013-07-11 16:43:03

+0

當我嘗試這個工具提示沒有出現。 Zarkonnen的答案雖然工作。 – Amber 2016-11-14 22:08:36

回答

14

getTooltipText上JTree的。這應該允許您顯示工具提示,具體取決於樹中的內容。 (不過,請閱讀文檔,您需要使用ToolTipManager註冊JTree。)

1

是的,您可以使用onMouseMoved然後使用一個方法(我不記得名稱)告訴你在哪個節點中過度。如果你得到null,顯然那麼你不在節點上。

0

當處理特定的TreeNode子類時,根據您自己的回答和意見,我想出了一個用於實現我的TreeNode的接口。

注意我們如何檢查valueTooltipableTreeCellRenderer的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); 
} 
相關問題