2011-09-07 55 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的,並選擇最後一個節點。我認爲每次以編程方式選擇一個節點時,我都不選擇前一個節點。

JTree的配置是這樣的:

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

回答

6

非選擇是因爲你設置一個新的選擇路徑,而不是添加的。在擴大後的循環,而不是做

​​3210

編輯

閱讀API始終是有益的,雖然經過了多年;-)剛剛發現一個更傻笑方法,這讓所有的工作樹:

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

外觀極好抓,你怎麼會...... +1 – mKorbel

+0

謝謝,我一直在半上午尋找一個方法:) –

0

肯定是可能的,例如:

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的答案(根據我自己的成長的痛苦)。

在我的特殊問題,我需要添加一個「Select All Children」菜單項到JTree節點彈出菜單。因此,此解決方案適用於選定節點的所有子節點。

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); 
    } 
} 
相關問題