2012-04-20 26 views
8

मेरे पास JTree और awt.Canvas है। जब मैं Canvas के भीतर objList में एकाधिक ऑब्जेक्ट्स का चयन करता हूं, तो मैं चाहता हूं कि सभी चयनित आइटम JTree के अंदर चुने गए हों। इसका मतलब है उदाहरण के लिए यदि मेरे पास 2 ऑब्जेक्ट्स चुने गए हैं, तो रूट के लिए उनके पथ दोनों का विस्तार किया जाना चाहिए, और प्रत्येक चयनित ऑब्जेक्ट में इसके संबंधित TreeNode चयनित होना चाहिए। मेरे जेटी में TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION है। ,जावा: JTree में प्रोग्रामिंग रूप से एकाधिक नोड्स का चयन और विस्तार कैसे करें?

public void selectTreeNodes() { 


    HashMap <String, MyEntity> entities = ...; 
    Iterator it = entities.keySet().iterator(); 
    while (it.hasNext()) { 

     String str = it.next().toString(); 
     MyEntity ent = entities.get(str); 

     if (ent.isSelected()) { 
      DefaultMutableTreeNode searchNode = searchNode(ent.getName()); 
      if (searchNode != null) { 

       TreeNode[] nodes = ((DefaultTreeModel) tree.getModel()).getPathToRoot(searchNode); 
       TreePath tpath = new TreePath(nodes); 
       tree.scrollPathToVisible(tpath); 
       tree.setSelectionPath(tpath); 
      } 
     } 
    } 
} 

public DefaultMutableTreeNode searchNode(String nodeStr) 
{ 
    DefaultMutableTreeNode node = null; 

    Enumeration enumeration= root.breadthFirstEnumeration(); 
    while(enumeration.hasMoreElements()) { 

     node = (DefaultMutableTreeNode)enumeration.nextElement(); 
     if(nodeStr.equals(node.getUserObject().toString())) { 

      return node;       
     } 
    } 

    //tree node with string node found return null 
    return null; 
} 

मेरे वर्तमान स्थिति में अगर मैं एक वस्तु का चयन करें, यह JTree में चयन किया जाएगा और इसके TreePath दिखाया जाएगा:

यहाँ विस्तार funcion मैं का उपयोग का एक नमूना है। लेकिन अगर entities में 1 से अधिक ऑब्जेक्ट चुने गए हैं, तो यह कुछ भी प्रदर्शित नहीं करेगा, मेरा JTree अपरिवर्तित रहेगा।

+0

* "मेरे पास 'JTree' और' awt.Canvas' 'का उपयोग कर सकते हैं। * * एडब्ल्यूटी घटकों के साथ स्विंग मिश्रण न करें। 'कैनवास' एक 'जेपीनेल' या 'जेलाबेल' में प्रदर्शित एक छवि होना चाहिए। –

+0

मुझे पता है कि मुझे आमतौर पर ऐसा नहीं करना चाहिए (मुझे कैनवास के पीछे मुख्य मेन्यू के साथ कुछ समस्याएं हैं), लेकिन इस मामले में उनके बीच एकमात्र कनेक्शन पेड़ में प्रदर्शित कैनवास से इकाइयों की सरणी है। और जीयूआई में उनके बीच कुछ जगह है, इसलिए कोई नुकसान नहीं हुआ/ –

उत्तर

14

आप JTree के TreeSelectionModel (गेटटर का उपयोग करें) की तलाश में हैं। एकाधिक पथों के लिए TreeSelectionModel#setSelectionPaths का उपयोग करें। अब आप केवल tree.setSelectionPath(tpath); कॉल के कारण चयनित एक नोड सेट कर रहे हैं। TreeSelectionModel में मौजूदा चयन को जोड़ने/हटाने के तरीके भी हैं ... (मूल रूप से भविष्य में आपको जो कुछ भी चाहिए)।

विस्तार के लिए एक दिलचस्प तरीका JTree#setExpandsSelectedPaths विधि है जो चयनित पथों को स्वचालित रूप से विस्तारित करने के लिए JTree को कॉन्फ़िगर करने की अनुमति देती है। यदि आप इसे मैन्युअल रूप से प्रबंधित करना चाहते हैं, तो आप JTree#setExpandedState विधि

+0

धन्यवाद। मैं महीनों के लिए इस पर अटक गया था। – nslntmnx