2010-12-10 9 views
13

में शीर्ष कार्ड कैसे प्राप्त करें जावा के कार्डलाउट में शीर्ष कार्ड प्राप्त करना संभव है? मैंने दृश्यमान() के साथ दृश्यता की जांच करने के लिए प्रत्येक घटक के माध्यम से लूपिंग करने का प्रयास किया है, लेकिन ऐसा लगता है कि वे सभी "दृश्यमान" हैं।जावा के कार्डलेआउट

संपादित करें: "शीर्ष कार्ड" से मेरा मतलब है कि वर्तमान में "शीर्ष" पर मौजूद है, जिसे प्रदर्शित किया जा रहा है, पहले या अंतिम कार्ड नहीं। इसके अलावा, मैं अगर यह मदद करता है पता नहीं है लेकिन मैं एक JPanel के लिए देख रहा हूँ (या एक उपवर्ग क्या है)

संपादित करें: कोड स्निपेट

for (Component component : getComponents()) { 
if (component instanceof JPanel && component.isVisible()) { 
    currentPanel = (JPanel) component; 
    System.out.println(currentPanel.getClass().getName()); 
} 
} 

ऊपर कोड हमेशा हर घटक वर्ग के नाम बाहर प्रिंट, भले ही वे दृश्य कार्ड हों या नहीं।

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

संपादित करें: कारण मैं शीर्ष कार्ड प्राप्त करने का प्रयास कर रहा हूं क्योंकि मेरे पास "जोड़ें" बटन वाला टूलबार है। मेरी दो संभावित चीजों में से प्रत्येक के लिए एक ऐड बटन रखने के बजाय मैं यह जानना चाहता था कि वर्तमान में कौन सा पैनल देखा जा रहा है, यह देख कर कौन सा जोड़ना है। यदि ऐसा करने का कोई और अधिक उचित तरीका है तो कृपया मुझे बताएं।

संपादित करें: सभी को मदद करने के लिए धन्यवाद। मुझे पता चला कि समस्या क्या थी। मुझे लगता है कि यह मेरी गलती थी क्योंकि मैंने पर्याप्त जानकारी प्रदान नहीं की थी। मेरे दो कार्ड JScrollPane एस हैं और मुझे यह पता लगाने के लिए इसकी सामग्री को देखने की भी आवश्यकता है कि क्या उन पैनलों में से एक मैं देख रहा था। मैंने स्क्रॉल फलक पर isVisible() की जांच नहीं की थी, मैं इसके विरोधों को देख रहा था जो हमेशा दिखाई दे रहे हैं, यह स्क्रॉल फलक था जिसकी मुझे दृश्यता की आवश्यकता है।

public JPanel getCurrentPanel() { 
     JPanel currentPanel = null; 

     for (Component component : getComponents()) { 
      if (component.isVisible()) { 
       if (component instanceof JPanel) 
        currentPanel = (JPanel) component; 
       else if (component instanceof JScrollPane) 
        currentPanel = (JPanel) ((JScrollPane) component).getViewport().getComponent(0); 
      } 
     } 

     return currentPanel; 
    } 

उत्तर

11

यदि आप कोड में शामिल कोड स्निपेट को संशोधित करते हैं तो आप आसानी से बता सकते हैं कि कौन सा कार्ड दिखाई दे रहा है। मेरे टेस्ट फ्रेम में, जब बटन धक्का दिया जाता है, तो यह अगले कार्ड पर जाने से पहले, वर्तमान में दिखाई देने वाले कार्ड के नाम को प्रिंट करता है। अपने कोड को संशोधित करना, ध्यान में रखना महत्वपूर्ण बात यह है कि आपको उस घटक पर getComponents() को कॉल करने की आवश्यकता है जिसमें वास्तव में कार्डलाउट है। इस तरह, केवल उसके बच्चों में से एक दिखाई दे रहा है। मैं आपके कोड में अनुमान लगा रहा हूं कि आप फ्रेम पर कॉम्पोनेंट्स को कॉल कर रहे हैं जिसमें कार्डलेआउट के साथ आपका जेपीनल शामिल है।

class TestFrame 
     extends JFrame 
     implements ActionListener 
{ 
    public TestFrame() 
    { 
     cards = new JPanel(new CardLayout()); 
     card_list = new JPanel[5]; 

     for (int i = 0; i < card_list.length; i++) { 
      String text = "Card " + i; 
      JPanel card = createCard(text); 
      card_list[i] = card; 
      cards.add(card, text); 
     } 

     add(cards); 
    } 

public JPanel getCurrentCard() 
{ 
    JPanel card = null; 

    for (Component comp : cards.getComponents()) { 
     if (comp.isVisible() == true) { 
      card = (JPanel)comp; 
      System.out.println(card.getName()); 
     } 
    } 
    System.out.println(); 

    return card; 
} 

public void actionPerformed(ActionEvent evt) 
{ 
    JPanel card = getCurrentCard(); 

    CardLayout cl = (CardLayout)(cards.getLayout()); 
    cl.next(cards); 
} 

    public JPanel createCard(String text) 
    { 
     JPanel card = new JPanel(); 
     card.setName(text); 

     JButton btn = new JButton(text); 
     btn.addActionListener(this); 

     card.add(btn); 
     return card; 
    } 

    JPanel cards; 
    JPanel[] card_list; 
} 

विधि actionPerformed() में, मैं कार्ड के नाम मुद्रित, लेकिन आप वर्तमान में दृश्यमान कार्ड के लिए एक संदर्भ है।

+0

@RD, कोड स्निपेट जेपीनल में 'getCurrentPanel()' विधि के प्रयास से है जो कार्डलेआउट का उपयोग करता है। मैंने जेपीनेल को अन्य कारणों से बढ़ा दिया है, इसलिए मुझे इसकी पहुंच है। – alexcoco

+0

ठीक है, आपके सभी कोड को देखे बिना, मैं आपको बता नहीं सकता कि क्या गलत हो रहा है, लेकिन मैं आपको बता सकता हूं कि मेरा टेस्टफ्रेम कोड सही समय पर केवल एक दृश्य कार्ड पाता है। –

+0

@alexcoco, प्रासंगिक कोड को getCurrentCard() विधि में डालने के लिए संपादित किया गया। –

0

CardLayout.first() के कार्यान्वयन जो शीर्ष कार्ड स्थापित करने के लिए दिखाई दे आप निम्नलिखित है माना जाता है में:

int ncomponents = parent.getComponentCount(); 
for (int i = 0 ; i < ncomponents ; i++) { 
    Component comp = parent.getComponent(i); 
    if (comp.isVisible()) { 
     comp.setVisible(false);  // hide previously visible components 
     break; 
    } 
} 

if (ncomponents > 0) { 
    currentCard = 0; 
    parent.getComponent(0).setVisible(true); // set visibility of component 0 
    parent.validate(); 
} 

तो मैं आप yourContainer.getComponent(0) द्वारा "शीर्ष कार्ड" की पकड़ प्राप्त कर सकते हैं लगता है।

+0

क्षमा करें, मेरा पहला कार्ड नहीं था। मैंने सवाल अपडेट किया। – alexcoco

+2

आह। मेरी गलती। ऐसा लगता है कि आप घटकों के माध्यम से लूप करने में सक्षम होना चाहिए और 'isVisible'' की तलाश करना चाहिए ... क्या आप वाकई यह काम नहीं करते हैं ?? – aioobe

+0

हाँ, उन सभी के माध्यम से लूपिंग और मूल्य प्रिंट करना हमेशा मुझे एक कार्ड के साथ छोड़ देता है भले ही दृश्य कार्ड बदल गया हो। मैं स्निपेट के साथ एक सेकंड में अपडेट करूंगा। – alexcoco

2

मैंने इस प्रकार की कार्यक्षमता प्रदान करने के लिए कार्डलाउट बढ़ाया। Card Layout Focus देखें।

संपादित करें:

तब घटकों 0. इस का एक ZOrder साथ compnent की तलाश के माध्यम से लूप एक है कि शीर्ष पर चित्रित किया गया है। असल में आपको सभी घटकों के माध्यम से फिर से शुरू करने की ज़रूरत नहीं है, बस स्थिति 0 पर घटक प्राप्त करें। ZOrder कैसे काम करता है इसके बारे में अधिक विस्तृत विवरण के लिए ओवरलैप लेआउट पर मेरा ब्लॉग देखें।

Component visibleComponent = panelWithCardLayout.getComponent(0); 

EDIT2:

ऊपर संपादित गलत है। कार्डलायआउट के साथ उपयोग किए जाने पर ZOrder का कोई मतलब नहीं है। तो आप बस घटक 0 प्राप्त नहीं कर सकते हैं।

+0

हां, मैंने इसे पहले देखा है। लेकिन मैं ऐसा नहीं कर सकता। मैं एक दूसरे में एक स्पष्टीकरण के साथ सवाल अद्यतन करेंगे। – alexcoco

+0

@alexcoco, संपादन देखें। – camickr

+0

अभी इसे देख रहे हैं, धन्यवाद – alexcoco

-1

आप चर कार्ड दृश्यता

उदाहरण के लिए

के आधार पर परिवर्तन है कि सेट कर सकते हैं

int cardShow; 

और उसके बाद आप अपने कार्ड दिखाई

cards.show(card1, "card1"); 
cardShow = 1; 

सेट और जब आप प्राप्त करने की कोशिश है, जो कार्ड दृश्यमान है

if (cardShow == 1) 
//code in case of card1 is visible 
संबंधित मुद्दे