2011-09-07 26 views
5

Tüm düğümleri seçmek ve seçimini kaldırmak için bir Jtree ve 2 düğmem var.JTree: Tüm düğümleri programatik olarak seçme

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

unselect düğmesi çalışıyor görünüyor, ama seçme hepsi sadece JTree genişler ve son düğümü seçer: Böyle bir girişimde bulunmuştur. Sanırım programlı bir düğüm seçildiğinde, eskiden seçimini kaldırıyorum. örneğin,

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

cevap

6

unselect olur. genişlemesinden sonra döngü olarak, yerine ne

curvesTree.addSelectionPath(...) 

DÜZENLEME

okuma API yıl ;-) Sadece ağaca tüm çalışmaları bırakan çok simper yöntemini buldum sonra bile her zaman öğreticidir:

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

mükemmel yakalamak, sen nasıl ... 1 – mKorbel

+0

Teşekkürler, ben yarım sabah bu yöntem için seyir olmuştur :) –

0

evet mümkündür:

JTree böyle yapılandırıldığı yeni bir seçim yolunu ayarlayarak yerine ekliyoruz çünkü

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

rastgele kod parçacığı tekrar ;-) – kleopatra

0

Kleopatra'nın yanıtına (kendi büyüyen ağrılarıma dayanarak) eklemek istiyorum.

Benim sorunumda, JTree düğüm açılır menüsüne "Tüm Çocuklar Seç" menü öğesini eklemem gerekiyordu. Bu nedenle, bu çözüm seçilen bir düğümün tüm çocukları için geçerlidir.

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) özyinelemeli çağrı tüm yol aşağı yaprak düğümlere seçilen düğümden ağaç travers için gereklidir. Bu çözüm derinlikten bağımsız olarak çalışır (bilgimin en iyisine). Söyleyemediğim en verimli çözümdür. Daha iyi bir çözümü olan herkes, lütfen farklı bir çözüm yayınlamaktan veya bunu düzeltmekten çekinmeyin. aşağıdaki gibi

yöntem uygulamasıdır:

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); 
    } 
} 
İlgili konular