2009-05-06 10 views
10

मेरे पास TreeModel में प्रदर्शित डेटा ऑब्जेक्ट है, और मैं अपने JTree में इसका केवल एक हिस्सा दिखाना चाहता हूं - तर्क के लिए, पत्तियों और उनके माता-पिता कहें। मैं अनावश्यक नोड्स को कैसे छुपा/फ़िल्टर कर सकता हूं?एक जेटी में छुपा/फ़िल्टरिंग नोड्स?

+0

यह डुप्लिकेट की तुलना में पुराना और कम जानकारीपूर्ण धागा है: http://stackoverflow.com/questions/9234297/filtering-on-a-jtree – bobjandal

उत्तर

0

तब तक जब तक यह एक पेड़ दिखाई दे रहा है, तो TreeModel जो आपको मौजूदा TreeModel फ़िल्टर करता है, वह काफी सरल होना चाहिए।

+0

क्या आप इसे और समझा सकते हैं? –

+0

आप क्या जानना चाहते हैं। आपको उन उदाहरणों को ढूंढना आसान लगेगा जो टेबलमोडेल के समान हैं। आप एक ट्रीमोडेल बनाना चाहते हैं जो आपके वर्तमान मॉडल को प्रतिनिधि करता है, लेकिन उन नोड्स को हटा देता है जिन्हें आप दिखाना नहीं चाहते हैं।मेरा सुझाव है, कम से कम शुरू करने के लिए, आप सभी घटनाओं को ढांचे के रूप में प्रचारित करते हैं (हालांकि इसके बारे में सोचने के लिए आते हैं जो पेड़ के विस्तार को पतन का कारण बनेंगे)। –

+1

समस्या का एक हिस्सा यह है कि "उन नोड्स को हटाएं जिन्हें मैं प्रकट नहीं करना चाहता हूं" उनके बच्चों को भी हटा देता है, भले ही मैं उन्हें दिखाना चाहूंगा। –

0

आपके ट्रीनेड बनाने के लिए उपयोग किए जाने वाले कोड का लाभ उठाएं और केवल उन तत्वों सहित ट्रीनोड (पुनर्निर्माण) का पुनर्निर्माण करें। फ़िल्टर नोड नोड के साथ TreeModel पर रूट नोड सेट करें।

+0

यह करने योग्य है लेकिन जब आप एक और मॉडल सेट करते हैं, तो JTree हुड के नीचे बहुत सी चीजें करता है, खासकर यदि यह संरचनात्मक परिवर्तन का पता लगाता है। यह गति और स्मृति पदचिह्न दोनों के प्रदर्शन के संदर्भ में बहुत अच्छा नहीं है। – gouessej

8

मेरे अंतिम कार्यान्वयन:

  • दो TreeModel रों है, एक अंतर्निहित और फ़िल्टर्ड एक।
  • जब अंतर्निहित TreeModel पर कोई परिवर्तन होता है, तो फ़िल्टर किए गए TreeModel को स्क्रैच से पुनर्निर्माण करें। प्रत्येक नोड को क्लोन करें जो दिखाना चाहिए, और इसे फ़िल्टर किए गए TreeModel (या रूट अगर कोई दिखाई नहीं दे रहा है) में अपने पहले दिखाई देने वाले पूर्वजों में जोड़ें। यदि आप उत्सुक हैं, तो नीचे teh codez देखें।
  • यह उपयोगकर्ता द्वारा खोले गए हर पथ को ध्वस्त करने का दुर्भाग्यपूर्ण दुष्प्रभाव है। इस के आसपास जाने के लिए, मैंने फ़िल्टर किए गए TreeModel पर TreeModelListener जोड़ा। जब मॉडल बदलता है, तो मैं विस्तारित पथ JTree (getExpandedDescendants() का उपयोग करके) में सहेजता हूं, फिर बाद में उन्हें फिर से विस्तारित करें (SwingUtilities.invokeLater() का उपयोग करके)।

    मुझे TreeNode कक्षा में ओवरराइड करना था, जिसका उपयोग मैं कर रहा था ताकि नए क्लोन नोड पुराने क्लोन नोड्स के समान हों।


... 
    populateFilteredNode(unfilteredRoot, filteredRoot); 
    ... 

    void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode) 
    { 
    for (int i = 0; i < unfilteredNode.getChildCount(); i++) 
    { 
     TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i); 

     if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER) 
     { 
     populateFilteredNode(unfilteredChildNode, filteredNode); 
     } 
     else 
     { 
     TreeNode filteredChildNode = unfilteredChildNode.clone(); 

     filteredNode.add(filteredChildNode); 

     populateFilteredNode(unfilteredChildNode, filteredChildNode); 
     } 
    } 
    } 
2

आप JXTree की कोशिश की है? (दुर्भाग्य से वेबसाइट अभी नीचे है, लेकिन आप मिरर के लिए Google पर जा सकते हैं)

+0

दरअसल, JXTree में फ़िल्टर का समर्थन कभी भी लागू नहीं किया गया है, भले ही इसकी योजना बनाई गई हो, मैं बस अपने स्रोत कोड में फ़िल्टर करने के बारे में एक संरक्षित अप्रयुक्त फ़ील्ड देखता हूं। – gouessej

1

यदि आप एक वाणिज्यिक समाधान की तलाश में हैं, तो जैइडसोफ्ट में एक फ़िल्टर करने योग्य ट्रेमोडेल है। इसके अलावा, स्विंगएक्स में एक फ़िल्टर एपीआई है जो JXTable, JXTreeTable, JXTree, और JXList पर काम करेगी।

+0

धन्यवाद! मैंने जइड एक की कोशिश की, लेकिन मैं इसे जो करने के लिए नहीं कर सका। जब मुझे मौका मिलता है तो मैं स्विंगएक्स एपीआई में देखूंगा। –

+0

आप वास्तव में क्या करने की कोशिश कर रहे हैं? यदि आप विवरण प्रदान करते हैं, तो मैं कुछ विशिष्ट कोड दे सकता हूं। जो मैं समझता हूं, उससे खोज मानदंडों से फ़िल्टर की गई पत्तियां उनके माता-पिता के साथ दिखायी जाएंगी। यह उनके वेबस्टार्ट डेमो में दिखाया गया है, http://www.jidesoft.com/products/download.htm पर, 'सभी जैइड उत्पादों के लिए डेमो'। इसमें, क्विकफिल्टर (वृक्ष) डेमो देखें। – Aakash

+0

जैसा कि मुझे याद है, मुझे अदृश्य माता-पिता के दृश्यमान बच्चों को दिखाने के लिए जैइड पेड़ मॉडल प्राप्त करने में परेशानी हो रही थी। –

3

आपको GlazedLists से अवगत होना चाहिए। यह छोटे प्रयास के साथ जटिल तालिका परिवर्तन करने के लिए एक शानदार पुस्तकालय है। वे भी पेड़ तक फैल गए हैं। इसे ग्लेज़ेडलिस्ट के काम करने के तरीके में लाने के लिए आपके मौजूदा कोड का थोड़ा सा रिफैक्टरिंग की आवश्यकता हो सकती है। लेकिन यह देखने के लिए डेमो और वेबकास्ट देखें कि यह कितना शक्तिशाली है। (यह मेरे विचार में आवश्यक स्विंग पुस्तकालयों में से एक है, और यह खुला स्रोत है।)

+0

मुझे पेड़ के लिए ग्लेज़ेडलिस्ट में कुछ भी नहीं दिखाई देता है: https://java.net/projects/glazedlists/sources/svn/show/trunk/source/ca/odell/glazedlists/swing?rev=2375 कृपया आप हमें बता सकते हैं कि आपको कहां मिला पेड़ के लिए इसकी फ़िल्टरिंग एपीआई? – gouessej

+0

@gouessej यह एक्सटेंशन फ़ोल्डर में है: https://java.net/projects/glazedlists/sources/svn/show/trunk/extensions/treetable/source/ca/odell/glazedlists/swing?rev=2375 – arooaroo

+1

धन्यवाद लेकिन यह वृक्षों पर पेड़ की मेज पर काम करता है। – gouessej

1

इस कार्यान्वयन पर एक नज़र डालें: http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm

यह वास्तव में दूर करने के लिए एक "isVisible" संपत्ति जोड़ने के बजाय तो DefaultMutableNode की उपवर्गों बनाता है/TreeModel से नोड्स जोड़ना।

+0

मुझे हाल ही में एक जेटी में फ़िल्टरिंग को लागू करने की आवश्यकता है और यह समाधान अब तक का सबसे साफ और सरल था। – Aaron

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