2008-11-07 6 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

당신의 대답은 대답에 있어야 사람들이 투표 할 수 있도록, 상기 valueTreeCellRenderer에서 Tooltipable의 intance 경우 우리가 확인하는 방법

알 수 있습니다. –

+2

DefaultTreeCellRenderer # getTreeCellRendererComponent가 많이 호출되어 너무 무거 우면 항목이 예상대로 작동하지 않을 수 있습니다. 툴팁이 나타나야하지만 나타나지는 마세요. JTree # getToolTipText (MouseEvent e)를 재정의하는 것은 필요한 경우에만 호출되므로 더 나은 해결책입니다! – NomeN

+0

내가 이것을 시도했을 때 툴팁이 나타나지 않았다. Zarkonnen의 대답은 성공했습니다. – Amber

답변

14

이 JTree가에 getTooltipText를 참조하십시오. 이렇게하면 트리에서 무엇을 가리키고 있는지에 따라 툴팁을 표시 할 수 있습니다. (그래도 문서를 읽으려면 ToolTipManager에 JTree를 등록해야합니다.)

+3

+1 당신이'ToolTipManager'에 등록 할 필요가 있다는 것에주의하십시오. 문서에도 있지만 놓치기 쉽습니다. –

1

그래, onMouseMoved을 사용하고 어느 노드에 있는지 알려주는 방법 (이름이 기억 나지 않음)을 사용할 수 있습니다. 위에. 만약 당신이 null을 얻는다면, 분명히 당신은 노드를 넘지 않는다.

+1

마우스 위치를 트리 노드에 연결하는 메소드는'getPathForLocation (int, int)'와'getRowForLocation (int, int)'입니다. 다른 대답에 의해 제안 된 것처럼, 커스텀 렌더러를 구현하거나'getToolTipText (MouseEvent)'를 오버라이드하는 것은'MouseListener'를 추가하는 것보다 깔끔합니다. –

0

고객님의 답변과 의견을 토대로 특정 TreeNode 하위 클래스를 다룰 때 구현할 TreeNode 인터페이스가 필요했습니다.

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); 
} 
관련 문제