2010-04-26 23 views
17

मेरे पास JComponent एस JPanel पर हैं और जब मैं स्टार्ट बटन दबाता हूं तो मैं उन सभी घटकों को अक्षम करना चाहता हूं।जावा स्विंग - जेपीनल को कैसे अक्षम करें?

वर्तमान में, मैं सभी घटक

component1.setEnabled(false); 
: 
: 

द्वारा स्पष्ट रूप से अक्षम करने कर रहा हूँ लेकिन वहाँ है वैसे भी है जिसके द्वारा मैं एक बार में सभी घटकों को निष्क्रिय कर सकते हैं? मैं JPanel जो करने के लिए इन घटकों

panel.setEnabled(false); 

से जोड़ रहे हैं को निष्क्रिय करने की कोशिश की, लेकिन यह काम नहीं किया।

+0

किसी को क्यों करना होगा इस? स्विंग घटकों को एक जेडियलॉग पर रखना आसान लगता है जब आप ओके बटन पर क्लिक करते हैं जब आप अदृश्य बनाते हैं (जिसका नाम बदल दिया जा सकता है)। –

उत्तर

21

पैनल में getComponents() विधि होनी चाहिए जो उप-घटकों को स्पष्ट रूप से नाम देने के बिना किसी लूप में उपयोग कर सकती है।

+0

+1 मैंने इसका उपयोग किया है। चेतावनी हालांकि, यदि आपके उप-घटक कंटेनर हैं (उदाहरण के लिए लेआउट प्रबंधन के लिए उपयोग किए जाने वाले बक्से) तो आपको इसे फिर से करने की आवश्यकता है। साथ ही, यदि आपके पास ऐसे घटक हैं जो अन्य कारणों से अक्षम हो जाते हैं तो पुन: सक्षम करने से उन्हें पराजित किया जाएगा। – staticman

+1

स्थिर व्यक्ति के साथ सहमत हैं, यह एक खतरनाक व्यवहार है और इसका उपयोग करते समय आपको देखभाल की ज़रूरत है क्योंकि यदि आप कुछ सावधानी बरतें तो आप सब कुछ पुनः सक्षम कर देंगे। शायद यह आपके मामले के लिए कोई समस्या नहीं है तो आप इसे पसंद कर सकते हैं। या यदि यह एक पीबी है, तो आपको शायद अच्छी स्थिति में उन्हें रीसेट करने के लिए उन्हें सक्षम करने से पहले घटकों के राज्यों को याद रखना होगा। –

+0

यह थोड़ा मुश्किल है, लेकिन मैं खतरनाक नहीं कहूंगा। मेरा सामान्य दृष्टिकोण 'जेपीनेल' को उपclass करना होगा और 'setEnabled()' विधि को ओवरराइट करना होगा। वहां मैं आंतरिक स्थिति के आधार पर उचित उप-संयोजकों को मैन्युअल रूप से सक्षम/अक्षम कर दूंगा। – ZeissS

3

Disabled Panel दो दृष्टिकोणों के लिए समर्थन प्रदान करता है। एक घटक को दोबारा अक्षम करने के लिए, दूसरे को एक अक्षम देखो वाले पैनल को "पेंट" करने के लिए।

2

निम्न विधि इसे प्राप्त करने के लिए रिकर्सन का उपयोग करती है। Container में पास करें, और यह विधि Container के "अंदर" कहीं भी स्थित गैर-कंटेनर घटकों के Component सरणी को वापस कर देगी।

private Component[] getComponents(Component container) { 
     ArrayList<Component> list = null; 

     try { 
      list = new ArrayList<Component>(Arrays.asList(
        ((Container) container).getComponents())); 
      for (int index = 0; index < list.size(); index++) { 
       for (Component currentComponent : getComponents(list.get(index))) { 
        list.add(currentComponent); 
       } 
      } 
     } catch (ClassCastException e) { 
      list = new ArrayList<Component>(); 
     } 

     return list.toArray(new Component[list.size()]); 
     } 
    } 

बस लौटा सरणी के तत्वों के माध्यम से लूप करें और घटकों को अक्षम करें।

for(Component component : getComponents(container)) { 
    component.setEnabled(false); 
} 
0

निम्नलिखित विधि होना चाहिए सब तुम क्या जोड़ने की जरूरत है, तो आप setEnableRec(panel, true) या setEnableRec(panel, false) से कॉल करने की कर सकते हैं:

private void setEnableRec(Component container, boolean enable){ 
    container.setEnabled(enable); 

    try { 
     Component[] components= ((Container) container).getComponents(); 
     for (int i = 0; i < components.length; i++) { 
      setEnableRec(components[i], enable); 
     } 
    } catch (ClassCastException e) { 

    } 
} 
+0

यदि आप पकड़ के अंदर पहला निर्देश 'कंटेनर.सेट सक्षम (सक्षम)' ले जाते हैं, तो आप कंटेनरों की कुछ कार्यक्षमता रख सकते हैं, उदा। 'JTabbed' अभी भी क्लिक करने योग्य हो सकता है। –

+0

भी सावधान रहें क्योंकि यदि एक तत्व को सक्षम लूप में अक्षम रखा जाना चाहिए था, तो यह विधि सबकुछ ओवरराइड कर देगी। –

0

अक्षम रिकर्सिवली होने चाहिए:

Queue<Component> queue = new LinkedList<>(Arrays.asList(container.getComponents())); 
while(!queue.isEmpty()) { 
    Component head = queue.poll(); 
    head.setEnabled(enable); 
    if(head instanceof Container) { 
     Container headCast = (Container) head; 
     queue.addAll(Arrays.asList(headCast.getComponents())); 
    } 
} 
संबंधित मुद्दे