2010-12-22 2 views
1

다음 게시물을 가지고 있습니다 : blink a tree node
저는 맞춤형 셀 렌더러를 가지고 있습니다. 내 코드의 일부에서
나는 새의 DefaultMutableTreeNode을 만들고 나는 어떻게 내 휴대 렌더러에서 목록참조를 통해 jtree 노드를 조작하면 보이지 않습니다. (스윙)

public static List<DefaultMutableTreeNode> nodes = new ArrayList<DefaultMutableTreeNode>() 
//in some time 
DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("SomeValue"); 
nodes.add(node); 

에 저장 :이 시점 노드에서

public Component getTreeCellRendererComponent(JTree tree, Object value, 
     boolean selected, boolean expanded, boolean leaf, int row, 
     boolean hasFocus) { 
    DefaultMutableTreeNode n = (DefaultMutableTreeNode)value; 
    if(nodes.contains(n)){ 
    //set background to red 
    } 
} 

가 노드하지만 코드가 if 지점에 절대 들어 가지 않습니다.
왜? 나는 이미 그것을 arraylist에 저장했기 때문에 나는 이해할 수 없다. 다른 참조를 얻습니까?
또한 나는 스윙 타이머 생성 :

Timer t = new Timer(400, new ActionListener(){ 
    public void actionPerformed(ActionEvent evt) { 
     if(nodes.size == 0) 
      return; 
     TreePath p = new TreePath(nodes.get(0)); 
     Rectangle r = tree.getPathBounds(p); 
     tree.repaint(r); 
    } 

});  

을하지만 tree.getPathBounds에서 NPE를 얻을.
이유를 이해할 수 없습니다. 이 방법으로 내 목록에 저장된 DefaultMutableNodes를 조작 할 수 있습니까? 내 생각에 내가 뭘 잘못하고 있니?
참고 : 단순히 repaint()를 호출하면됩니다. 타이머와 노드를 통해 셀 렌더링 I 루프는 내가 저장 한 노드와 sametext를 표시하는 경우, 내가이 깜박 얻을 원하는 것을 참조

감사

답변

0

실제로 TreePath은 트리 루트에서 노드까지의 개체 목록입니다. 단일 노드에서 경로를 작성하면 노드가 트리의 루트 인 경우에만 경로가 트리에 존재합니다. TreeSelectionEvent public TreePath[] getPaths() 방법을 사용하는 것이 좋습니다. 이 메서드는 실제 경로를 제공합니다.

+0

그래서'DefaultMutableTreeNodes'의 목록이 저장되어 있고 각 사각형에 (스윙 타이머에서) 다시 그리기를 원한다면 어떻게해야합니까? 왜냐하면 유일한 방법은 저장된 노드로부터'TreePath'를 생성 한 다음'getPathBounds'를 호출하는 것입니다. 그러나 이것은 (내 게시물에서 언급 한 것처럼) 작동하지 않습니다. 그렇다면 저장된 노드의 사각형을 어떻게 얻을 수 있습니까? – Cratylus

1

나는 생각하지 않는다 작동합니다 DefaultMutableTreeNode는 equals 메서드를 정의하므로 노드 목록에서 일치하는 항목을 찾지 못할 수 있습니다. 사용자 객체를 저장 및 검색하거나 DefaultMutableTreeNode를 확장하고 equals를 정의하십시오.

+0

좋습니다. 하지만 NPE는 treePath를 사용합니까? – Cratylus

+0

확실하지 않습니다. tree.repaint()가 작동합니까? 문제가되는 범위를 벗어나고 있습니까? – jzd