2011-09-07 8 views
5

나는 모든 노드를 선택하거나 선택 취소하기 위해 Jtree와 2 개의 버튼이 있습니다.JTree : 프로그래밍 방식으로 모든 노드 선택

selectAll = new JButton("Select all"); 
selectAll.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
       int row = 0; 
       while (row < curvesTree.getRowCount()) 
       { 
        curvesTree.expandRow(row); 
        row++; 
       } 
      int entradasTree = curvesTree.getRowCount(); 
      for(int i=0; i<entradasTree; i++){ 
       TreePath path = curvesTree.getPathForRow(i); 
       curvesTree.setSelectionPath(path); 
      } 
     } 
    }); 

     unselectAll = new JButton("Unselect all"); 
     unselectAll.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       curvesTree.clearSelection(); 
      } 
     }); 

비 선택 버튼을 작동하는 것 같군,하지만 선택은 모든 단지의 JTree를 확장하고 마지막 노드를 선택 :이 같은 시도를했다. 노드가 프로그래밍 방식으로 선택 될 때마다 나는 이전 노드를 선택 취소합니다. 예를 들어,

curvesTree = new JTree(rootNode); 
curvesTree.setExpandsSelectedPaths(true); 
curvesTree.getSelectionModel().setSelectionMode(TreeSelectionModel. 
        DISCONTIGUOUS_TREE_SELECTION); 

답변

6

미선택 발생합니다. 확장 후 루프에서 대신 할

curvesTree.addSelectionPath(...) 

편집

읽기 API 년 ;-) 그냥 트리에 모든 작업을 잎 훨씬 선웃음 방법을 발견 한 후에도 항상 교훈입니다 :

tree.setSelectionInterval(0, tree.getRowCount()); 
+1

excelent 캐치, 당신을 어떻게했는지 ... +1 – mKorbel

+0

감사합니다, 나는 반 아침에 그 방법을 찾고있다 : –

0

예가 가능하다 :

의 JTree는 다음과 같이 구성되어 새 선택 경로를 설정하는 대신 추가되기 때문에

import java.awt.Dimension; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.tree.*; 

public class TreeWithMultiDiscontiguousSelections { 

    public static void main(String[] argv) { 
     JTree tree = new JTree(); 
     tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); 
     int treeSelectedRows[] = {3, 1}; 
     tree.setSelectionRows(treeSelectedRows); 
     TreeSelectionListener treeSelectionListener = new TreeSelectionListener() { 

      @Override 
      public void valueChanged(TreeSelectionEvent treeSelectionEvent) { 
       JTree treeSource = (JTree) treeSelectionEvent.getSource(); 
       System.out.println("Min: " + treeSource.getMinSelectionRow()); 
       System.out.println("Max: " + treeSource.getMaxSelectionRow()); 
       System.out.println("Lead: " + treeSource.getLeadSelectionRow()); 
       System.out.println("Row: " + treeSource.getSelectionRows()[0]); 
      } 
     }; 
     tree.addTreeSelectionListener(treeSelectionListener); 
     JFrame frame = new JFrame("JTree With Multi-Discontiguous selection"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(tree)); 
     frame.setPreferredSize(new Dimension(380, 320)); 
     frame.setLocation(150, 150); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private TreeWithMultiDiscontiguousSelections() { 
    } 
} 
+0

임의의 코드를 다시 ;-) – kleopatra

0

나는 kleopatra의 대답에 (내 자신의 성장통에 근거하여) 덧붙이고 싶습니다.

내 특정 문제에서, 노드 팝업 메뉴 JTree에 "Select All Children"메뉴 항목을 추가해야했습니다. 따라서이 솔루션은 선택된 노드의 모든 하위 노드에 적용됩니다.

TreeNode selectedNode = tree.getSelectionPath().getLastPathComponent(); 
// Expand tree from selected node... 
List<TreePath> paths = new ArrayList<TreePath>(); 
determineTreePaths(selectedNode, paths); // Recursive method call... 

TreePath[] treePaths = new TreePath[paths.size()]; 
Iterator<TreePath> iter = paths.iterator(); 

for (int i = 0; iter.hasNext(); ++i) 
{ 
    treePaths[i] = iter.next(); 
} 

if (paths.size() > 0) 
{ 
    TreePath firstElement = paths.get(0); 
    setSelectionPath(firstElement); 
    scrollPathToVisible(firstElement); 
}  

determineTreePaths(selectedNode, paths) 재귀 호출은 끝까지 리프 노드로 선택된 노드에서 트리를 탐색하기 위해 필요합니다. 이 솔루션은 깊이에 관계없이 작동합니다 (내 지식 수준). 내가 말할 수없는 것은 그것이 가장 효율적인 해결책이라는 것입니다. 더 나은 해결책을 가진 사람이라면 언제든지 다른 해결책을 게시하거나이 책을 편집하십시오. 다음과 같이

방법 구현은 다음과 같습니다

private void determineTreePaths(TreeNode currentNode, List<TreePath> paths) 
{ 
    paths.add(new TreePath(((DefaultTreeModel) getDefaultTreeModel()).getPathToRoot(currentNode)); 

    // Get all of my Children 
    Enumeration<?> children = currentNode.children(); 

    // iterate over my children 
    while (children.hasMoreElements()) 
    { 
     TreeNode child = (TreeNode) children.nextElement(); 
     determineTreePaths(child, paths); 
    } 
} 
관련 문제