2012-05-30 26 views
6

मैं एक कोड उदाहरण है कि इस कोड का इस्तेमाल किया को देखा:कार्डलाउट में अलग-अलग कार्ड कैसे दिखाएं?

cl.show(cardPanel, "" + (currentCard)); 

लेकिन जब मैं show का उपयोग मैं ग्रहण में एक संदेश है कि यह पदावनत है मिलता है और मुझे आश्चर्य है कि एक और तरीका CardLayout में अलग कार्ड दिखाने के लिए वहाँ है अगर जब मैं बटन पर क्लिक करता हूं? नीचे मेरे कार्डलाउट कक्षा के लिए कोड है। कोड का कुछ हिस्सा खराब अभ्यास होने पर सुझाव भी स्वागत है। धन्यवाद!

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class CardLayoutTest extends JFrame implements ActionListener { 

// Ref 
private JPanel cardPanel, jp1, jp2, buttonPanel; 
private JLabel jl1, jl2; 
private JButton btn1, btn2; 
private CardLayout cardLayout; 

// Konstruktor 
public CardLayoutTest() 
{ 
    setTitle("Test med CardLayout"); 
    setSize(600,400); 

    cardPanel = new JPanel(); 
    buttonPanel = new JPanel(); 

    cardPanel.setLayout(cardLayout); 

    jp1 = new JPanel(); 
    jp2 = new JPanel(); 

    jl1 = new JLabel("Card 1"); 
    jl2 = new JLabel("Card 2"); 

    jp1.add(jl1); 
    jp2.add(jl2); 

    cardPanel.add(jp1, "1"); 
    cardPanel.add(jp2, "2"); 

    btn1 = new JButton("Show Card 1"); 
    btn2 = new JButton("Show Card 2"); 

    buttonPanel.add(btn1); 
    buttonPanel.add(btn2); 

    getContentPane().add(cardPanel, BorderLayout.NORTH); 
    getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

    btn1.addActionListener(this); 
} 

    public void actionPerformed(ActionEvent event) 
    { 
     // ??? Show card 1 ??? 

     // ??? Show card 2 ??? 
    } 

public static void main(String[] args) { 
    CardLayoutTest frame = new CardLayoutTest(); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

उत्तर

13

संपादित करें (मैं अपने कोड उदाहरण की कोशिश की) यदि

1.you सबसे महत्वपूर्ण चर प्रारंभ करने में

private CardLayout cardLayout = new CardLayout(); 

2.Then SSCCE हो सकता है

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class CardLayoutTest extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JPanel cardPanel, jp1, jp2, buttonPanel; 
    private JLabel jl1, jl2; 
    private JButton btn1, btn2; 
    private CardLayout cardLayout = new CardLayout(); 

    public CardLayoutTest() { 
     setTitle("Test med CardLayout"); 
     setSize(400, 300); 
     cardPanel = new JPanel(); 
     buttonPanel = new JPanel(); 
     cardPanel.setLayout(cardLayout); 
     jp1 = new JPanel(); 
     jp2 = new JPanel(); 
     jl1 = new JLabel("Card 1"); 
     jl2 = new JLabel("Card 2"); 
     jp1.add(jl1); 
     jp2.add(jl2); 
     cardPanel.add(jp1, "1"); 
     cardPanel.add(jp2, "2"); 
     btn1 = new JButton("Show Card 1"); 
     btn1.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       cardLayout.show(cardPanel, "1"); 
      } 
     }); 
     btn2 = new JButton("Show Card 2"); 
     btn2.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       cardLayout.show(cardPanel, "2"); 
      } 
     }); 
     buttonPanel.add(btn1); 
     buttonPanel.add(btn2); 
     add(cardPanel, BorderLayout.NORTH); 
     add(buttonPanel, BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CardLayoutTest frame = new CardLayoutTest(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
+0

नए कोड के लिए धन्यवाद! यह अच्छा काम कर रहा है! लेकिन मेरे पास कुछ पंक्तियों के बारे में कुछ प्रश्न हैं जो आपने जोड़े हैं, इस तरह: निजी स्थैतिक अंतिम लंबे सीरियल VersionUID = 1L; मैं देख सकता हूं कि मैंने ग्रहण में एक पीला चेतावनी त्रिभुज हटा दिया, लेकिन यह क्या कर रहा है? और आपने इस लाइन को भी बदल दिया: getContentPane()। जोड़ें (कार्डपेनल, BorderLayout.NORTH); इसके साथ: जोड़ें (कार्डपैनल, सीमाबद्धआउट.NORTH); क्या फर्क पड़ता है? और अंत में आप भी दयालु हो सकते हैं और समझा सकते हैं कि आपने मुख्य विधि में क्या किया है? धन्यवाद! –

8

यह सबसे अधिक संभावना है कि आप JPanel पर शो() बुला रहे हैं, बल्कि CardLayout से है भूल गया।

विधि शो() जेपीनल (अधिक विशेष रूप से घटक) में मौजूद था और इसे सेट विज़िबल() द्वारा प्रतिस्थापित किया गया है। यह कार्डलाउट के शो() विधि से बिल्कुल अलग है।

करें कि आप अपने कार्रवाई श्रोता

CardLayout cardLayout = (CardLayout)(cardPanel.getLayout()); 
cardLayout.show(cardPanel, "CardToShow"); 

एक पक्ष नोट के रूप में में निम्नलिखित की तरह कुछ कर रहे हैं सुनिश्चित करें, ऐसा प्रतीत नहीं करता है आप कर रहे हैं "Newing" अपने CardLayout। सुनिश्चित करें कि आप ऐसा करते हैं।

+0

हां, मैंने अपने कार्डलाउट को "नया" याद किया और मैंने शो के साथ कुछ गलत भी किया! धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^