2011-09-07 15 views
5

मेरे पास एक जेट्री है, और 2 बटन सभी नोड्स का चयन और चयन रद्द करने के लिए हैं।जेटीआर: प्रोग्रामिंग के सभी नोड्स का चयन

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

का चयन रद्द होता है क्योंकि आप एक नया चयन पथ सेट कर रहे हैं के बजाय जोड़ने। के विस्तार के बाद पाश में, बजाय कर

curvesTree.addSelectionPath(...) 

संपादित

पढ़ने एपीआई हमेशा शिक्षाप्रद है, साल ;-) बस पाया एक बहुत मुसकुराना विधि है, जो पेड़ से सब काम छोड़ देता है के बाद भी:

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 के जवाब में जोड़ने के लिए चाहते हैं (अपने ही बढ़ती दर्द के आधार पर)।

मेरी विशेष समस्या में, मुझे 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); 
    } 
} 
संबंधित मुद्दे