2012-06-18 3 views
3

일부 (사용자 정의) 노드로 채워진 JTree가 있습니다. DefaultTreeCellRenderer의 서브 클래스 인 클래스가 있고 "MyTreeCellRenderer"를 사용하여 트리의 각 노드에 툴팁을 설정할 수 있습니다. JTree가 채워지고, 셀 렌더러가 설정되며, 추가 된 모든 노드에는 툴팁이 있습니다. 문제는 이미 채워진 트리에서 특정 노드에 대한 툴팁을 변경하는 방법을 모르겠다 ... 어떻게해야합니까? JTree의 한 노드에 대해서만 셀 렌더러를 "다시 생성"할 수있는 방법이 있습니까?JTree 노드의 변경 가능한 툴팁

+1

어떤 생각을 더 빨리 [SSCCE] (HTTP를 게시 더 나은 도움을 JToolTip를 구성하는 방법 : //sscce.org/) – mKorbel

답변

6

나는 그것을했다! 확장 된 CellRenderer를 사용하는 대신 트리의 "getTooltipText"메서드를 사용했습니다 (트리를 확장했습니다). 그렇게하면 마우스 포인터가있는 객체에 따라 툴팁의 텍스트를 제어 할 수있었습니다. 툴팁 렌더링하기 전에

@Override 
public String getToolTipText(MouseEvent evt) { 
    if (getRowForLocation(evt.getX(), evt.getY()) == -1) 
     return null; 
    TreePath curPath = getPathForLocation(evt.getX(), evt.getY()); 
    TreeNode node = (TreeNode)curPath.getLastPathComponent(); 
    if(something) 
     return "Empty"; 

    if(something_else) 
     return "Not empty"; 

    return null; 
    } 

당신은 또한 당신의 나무에 대한 툴팁 관리자에게 신고해야합니다

ToolTipManager.sharedInstance().registerComponent(myTree); 
+0

왜 TreeCellRenderer에서 대신이 메서드를 재정의 했습니까? 그 문제가 있었나요? 이 작업은 가능하지만 네이티브 API 및 코드로 작업하고 셀 렌더링을 셀 렌더러에 남겨 두는 것이 항상 더 깨끗합니다. –

+0

글쎄,이 접근 방식은 나에게 더 의미가 있었다. 그것은 분명히 (적어도 나에게) 보인다 : – guest86

+2

"뭔가"와 "something_else"에서 수행하는 테스트 종류에 대해 궁금합니다. JTree 컨텍스트에서 이들에게는 더 간단 할 수 있습니다. 나는 당신이 그것을 더 명확하게 발견한다면 이것에 대해 많이 논쟁하지 않을 것입니다. 나는 "셀 렌더러"에서 "셀 렌더링"을 수행하는 대신 자신의 방식대로하는 것이 더 명확한 방법으로 혼란스러워합니다. –

5

귀하의 질문에 대한 이해에서부터 트리의 특정 노드 렌더링을 트리거하려고합니다. 적절한 이벤트를 발생 시키려면 TreeModel을 통해 수행해야합니다 (예 : treeNodesChanged). DefaultTreeModel은 그 목적을위한 유틸리티 메소드 인 nodeChanged을 제공합니다.

그러나 JTree의 툴팁은 TreeCellRenderer를 다시 호출하여 JTree가 사전에 처리하므로 툴팁을 변경하기 위해 수행해야하는 작업이 없습니다. 툴팁을 표시해야 할 때마다 지정된 노드의 렌더링이 수행됩니다. 트리의 노드를 중심으로 마우스를 움직여 툴팁을 지속적으로 업데이트하는이 예제를 참조하십시오.

import java.awt.Component; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.List; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.ToolTipManager; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreeNode; 

public class TestTree { 

    public class MyTreeCellRenderer extends DefaultTreeCellRenderer { 

     private int rendering = 0; 

     @Override 
     public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, 
       boolean hasFocus) { 
      Component cell = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
      if (cell instanceof JComponent) { 
       ((JComponent) cell).setToolTipText("Hello " + rendering++); 
       if (value instanceof Node && cell instanceof JLabel) { 
        ((JLabel) cell).setText(((Node) value).name); 
       } 
      } 
      return cell; 
     } 
    } 

    private JFrame f; 
    private JTree tree; 

    protected void initUI() { 
     Node root = new Node("Root"); 
     fillTree(root, 5, "Some tree label"); 
     DefaultTreeModel model = new DefaultTreeModel(root); 

     tree = new JTree(model); 
     ToolTipManager.sharedInstance().registerComponent(tree); 
     tree.setCellRenderer(new MyTreeCellRenderer()); 
     f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.add(new JScrollPane(tree)); 
     f.pack(); 
     f.setVisible(true); 

    } 

    public void fillTree(Node parent, int level, String label) { 
     for (int i = 0; i < 5; i++) { 
      Node node = new Node(label + " " + i); 
      parent.addNode(node); 
      if (level > 0) { 
       fillTree(node, level - 1, label); 
      } 
     } 

    } 

    public class Node implements TreeNode { 

     private Node parent; 
     private List<Node> children; 
     private String name; 

     public Node(String name) { 
      this.name = name; 
      this.children = new ArrayList<TestTree.Node>(); 
     } 

     public void addNode(Node child) { 
      children.add(child); 
      child.parent = this; 
     } 

     @Override 
     public TreeNode getChildAt(int childIndex) { 
      return children.get(childIndex); 
     } 

     @Override 
     public int getChildCount() { 
      return children.size(); 
     } 

     @Override 
     public Node getParent() { 
      return parent; 
     } 

     @Override 
     public int getIndex(TreeNode node) { 
      return children.indexOf(node); 
     } 

     @Override 
     public boolean getAllowsChildren() { 
      return true; 
     } 

     @Override 
     public boolean isLeaf() { 
      return children.size() == 0; 
     } 

     @Override 
     public Enumeration<Node> children() { 
      return Collections.enumeration(children); 
     } 

    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTree().initUI(); 
      } 
     }); 
    } 

}