2009-03-31 3 views
5

मेरे पास एक JTree है जो बहु चयन तर्क लागू करता है।JTree "ctrl" चयन मोड को हमेशा सक्षम करने के लिए कैसे सेट करें

यह बहुत अच्छा काम करता है जब मैं माउस + Ctrl कुंजी दबाकर अपने सभी चयन करता हूं। यदि उपयोगकर्ता Ctrl कुंजी दबाकर चयन करता है तो यह मेरे तर्क को तोड़ देता है।

मैं वास्तव में यह नहीं देख सकता कि यह क्यों टूटता है लेकिन मुझे लगता है कि एक संभावित समाधान हमेशा TreeSelectionModel को इंगित करना है कि चयन Ctrl कुंजी दबाया गया है।

आप क्या सुझाव देंगे?

+0

में कुछ चीजों को स्पष्ट करने की आवश्यकता है । तो CTRL + बायाँ क्लिक आपको jtree में एकाधिक नोड्स चुनने देता है, लेकिन जब इसे क्लिक करना अभी केवल एक चुनता है? तो आप क्या चाहते हैं कि पेड़ के काम को ctrl के रूप में हमेशा दबाया जाए और केवल प्रत्येक क्लिक पर चयन जोड़ते रहें? – willcodejavaforfood

+0

@ विल्लकोडावाफॉर्फूड - बिल्कुल। –

उत्तर

5

मुझे लगता है मैं समाधान

आप JTree और DefaultTreeSelectionModel का विस्तार करने की आवश्यकता होगी मिल गया है।

JTree प्रासंगिक तरीके:

///////////////////////////////////////////////////// 
///////////////////////////////////////////////////// 
/// Implement selection using "adding" only logic. // 
///////////////////////////////////////////////////// 
///////////////////////////////////////////////////// 

@Override 
public void setSelectionPath(TreePath path) { 

    System.out.println("MLDebugJTree: setSelectionPath(" + path + ")"); 

    addSelectionPath(path); 

    return; 
    //super.setSelectionPath(path); 
} 

@Override 
public void setSelectionPaths(TreePath[] paths) { 

    System.out.println("MLDebugJTree: setSelectionPaths(" + paths + ")"); 

    addSelectionPaths(paths); 

    return; 
} 

@Override 
public void setSelectionRow(int row) { 

    System.out.println("MLDebugJTree: setSelectionRow(" + row + ")"); 

    addSelectionRow(row); 

    return; 
    //super.setSelectionRow(row); 
} 

@Override 
public void setSelectionRows(int[] rows) { 

    System.out.println("MLDebugJTree: setSelectionRows(" + rows + ")"); 

    addSelectionRows(rows); 

    return; 
    //super.setSelectionRows(rows); 
} 

DefaultSelectionModel प्रासंगिक तरीके:

package com.ml.tree2.model.impl; 

import javax.swing.tree.DefaultTreeSelectionModel; 
import javax.swing.tree.TreePath; 

public class MLTreeSelectionModel extends DefaultTreeSelectionModel { 
private static final long serialVersionUID = -4270031800448415780L; 

@Override 
public void addSelectionPath(TreePath path) { 
    // Don't do overriding logic here because addSelectionPaths is ultimately called. 
    super.addSelectionPath(path); 
} 

@Override 
public void addSelectionPaths(TreePath[] paths) { 
    if(paths != null) { 
     for(TreePath path : paths) { 

      TreePath[] toAdd = new TreePath[1]; 
      toAdd[0] = path; 

      if (isPathSelected(path)) { 
       // If path has been previously selected REMOVE THE SELECTION. 
       super.removeSelectionPaths(toAdd); 
      } else { 
       // Else we really want to add the selection... 
       super.addSelectionPaths(toAdd); 
      } 
     } 
    } 
} 

HTH।

public class MultiSelectionTreeUI extends BasicTreeUI 
{ 

    @Override 
    protected boolean isToggleSelectionEvent(MouseEvent event) 
    { 
     return SwingUtilities.isLeftMouseButton(event); 
    } 
} 

और फिर अपने JTree पर कि ui सेट:

+0

धन्यवाद, मैं इसे पर्याप्त रूप से ऊपर नहीं उठा सकता, इसने मुझे खोज के भार को बचाया! –

2

एक अन्य समाधान बस BasicTreeUI विस्तार करने के लिए और चयन व्यवहार को बदलने आपकी आवश्यकताओं के अनुरूप होगा

JTree tree = new JTree(); 
tree.setUI(new MultiSelectionTreeUI()); 
+0

आप इस समाधान के साथ एक और एल एंड एफ (पीएक्स। 'विंडोज ट्रीयूआई') के बजाय' बेसिकयूआई 'पर वापस जाएंगे, लेकिन यह सबसे साफ है। –

संबंधित मुद्दे