2014-04-17 8 views
1

일반적으로 축소 된 노드가 자동으로 선택되는 것을 원하지 않습니다. 대신 이전에 선택되었을 때 자식 노드가 선택 상태를 유지하기를 원합니다.접힌 후 트리 노드를 선택하지 않는 방법

아래의 SSCCE에서 "Fruits"를 펼친 다음 "banana"를 선택하십시오. 이제 "Fruits"노드의 아이콘 왼쪽에있는 접기 아이콘을 클릭하여 "Fruits"를 접습니다. "Fruits"노드가 접히고 현재 선택됩니다.

"Fruits"노드가 축소 된 후에도 "banana"노드를 계속 선택하고 싶습니다. 이것을 어떻게 할 수 있습니까?

감사합니다.

는 SSCCE : 보이지 않는 한 노드가 선택 할 수없는 것처럼 보인다 때문에

import javax.swing.JFrame; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 

public class TreeExample extends JFrame 
{ 
    private final JTree tree; 

    public TreeExample() 
    { 
     //create the root node 
     final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     //create the child nodes 
     final DefaultMutableTreeNode vegetableNode = new DefaultMutableTreeNode("Vegetables"); 
     final DefaultMutableTreeNode fruitNode = new DefaultMutableTreeNode("Fruits"); 

     final DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("apple"); 
     final DefaultMutableTreeNode bNode = new DefaultMutableTreeNode("banana"); 
     final DefaultMutableTreeNode cNode = new DefaultMutableTreeNode("coconut"); 
     final DefaultMutableTreeNode dNode = new DefaultMutableTreeNode("date"); 

     fruitNode.add(aNode); 
     fruitNode.add(bNode); 
     fruitNode.add(cNode); 
     fruitNode.add(dNode); 

     //add the child nodes to the root node 
     root.add(vegetableNode); 
     root.add(fruitNode); 

     //create the tree by passing in the root node 
     this.tree = new JTree(root); 
     this.add(this.tree); 

     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("JTree Example"); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public static void main(final String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new TreeExample(); 
      } 
     }); 
    } 
} 
+0

는 AFAIK 만 볼 노드를 선택할 수 있습니다 - 즉, 변경할 수있는 기회를, 깊은 UI 위양의 처리 때문에별로입니다. 당신이 정말로 그것을 원한다면, 당신은 아마 당신 자신의 분리 된 selectionModel을 유지하고 필요에 따라 다른 것을 업데이트해야 할 것입니다. – kleopatra

+0

SINGLE_TREE_SELECTION을 위해서 당신은 확장/축소 된 마우스 이벤트에서 잃어버린 선택을 할 수 있다고 생각합니다. – mKorbel

+0

@mKorbel 저는 아닙니다 네이티브 영어 연설자,하지만 당신의 문장은 뭔가를 놓칠 것 같습니다. – haferblues

답변

0

,이 솔루션을 함께했다. 이벤트로 디버깅 한 후, 노드를 접을 때 트리가 항상 "유효하지 않음"이라는 것을 발견했습니다. 그래서 JTree에서 fireValueChange()를 오버라이드합니다. 트리가 "유효"하면 값 변경이 수행됩니다. 그렇지 않으면 선택을 취소합니다. 선택을 지우지 않으면 UI에서 접힌 노드가 선택됩니다. 논리적으로 선택되지 않았기 때문에 잘못된 인상을줍니다. 선택을 지우면 축소 된 노드를 명시 적으로 선택할 수 있습니다. 이 솔루션은 내가 원하는 것에 가장 가깝습니다. 누락 된 점은 이전에 접힌 노드를 다시 확장하면 보이지 않는 노드가 선택된다는 것입니다.

지금까지 나를 위해 잘 작동합니다 :

this.tree = new JTree(this.rootNode) 
    { 
     @Override 
     protected void fireValueChanged(final TreeSelectionEvent e) 
     { 
      if (this.isValid()) 
       super.fireValueChanged(e); 
      else 
      { 
       super.clearSelection(); 
      } 

     } 

    };