2011-09-07 35 views
5

Tôi có một nút Jtree và 2 để chọn và bỏ chọn tất cả các nút. Tôi đã thực hiện một nỗ lực như sau:JTree: Chọn tất cả các nút theo chương trình

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(); 
      } 
     }); 

Nút bỏ chọn có vẻ đang hoạt động, nhưng chọn tất cả chỉ mở rộng JTree và chọn nút cuối cùng. Tôi nghĩ mỗi lần một nút được chọn theo chương trình, tôi sẽ bỏ chọn nút cũ.

JTree được cấu hình như thế này:

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

Trả lời

6

sự bỏ chọn xảy ra bởi vì bạn đang thiết lập một con đường lựa chọn mới thay vì thêm. Trong vòng lặp sau khi mở rộng, thay vì làm

curvesTree.addSelectionPath(...) 

EDIT

đọc api phải lúc nào cũng bài học, thậm chí sau nhiều năm ;-) Chỉ cần tìm thấy một phương pháp làm bộ cười nhiều, mà lá tất cả các công việc để cây:

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

xuất sắc đánh bắt, làm thế nào bạn ... 1 – mKorbel

+0

Cảm ơn, tôi đã được tìm kiếm phương pháp mà nửa buổi sáng :) –

0

có là có thể, ví dụ:

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

đoạn mã ngẫu nhiên một lần nữa ;-) – kleopatra

0

Tôi muốn thêm vào câu trả lời của kleopatra (dựa trên nỗi đau của chính tôi).

Trong vấn đề cụ thể của mình, tôi cần thêm mục menu "Chọn tất cả trẻ em" vào menu bật lên nút JTree. Do đó, giải pháp này áp dụng cho tất cả trẻ em của một nút đã chọn.

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); 
}  

Gọi determineTreePaths(selectedNode, paths) cần gọi đệ quy để di chuyển cây từ nút đã chọn đến hết các nút lá. Giải pháp này hoạt động bất kể độ sâu (theo hiểu biết tốt nhất của tôi). Những gì tôi không thể nói là nó là giải pháp hiệu quả nhất. Bất kỳ ai có giải pháp tốt hơn, vui lòng đăng một giải pháp khác hoặc chỉnh sửa giải pháp này.

Việc thực hiện phương pháp là như sau:

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); 
    } 
} 
Các vấn đề liên quan