2012-05-30 3 views
6

sah ich in einem Codebeispiel, das diesen Code verwendet:Wie zeigen Sie verschiedene Karten in einem CardLayout?

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

Aber wenn ich show verwende ich eine Nachricht in Eclipse, dass es veraltet ist und ich frage mich, ob es eine andere Möglichkeit ist es, die verschiedenen Karten in der Cardlayout zu zeigen, wenn ich auf die Knöpfe klicke? Unten ist der Code für meine CardLayout-Klasse. Vorschläge sind auch willkommen, wenn ein Teil des Codes eine schlechte Übung ist. Vielen Dank!

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); 
    } 
} 

Antwort

13

EDIT (I Ihr Codebeispiel versucht)

1.you vergessen wichtigste Variable

private CardLayout cardLayout = new CardLayout(); 

2.Then SSCCE könnte

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

Danke für den neuen Code! Es funktioniert gut! Aber ich habe einige Fragen über einige Zeilen, die Sie hinzugefügt haben, wie diese: private statische final long serialVersionUID = 1L; Ich kann sehen, dass ich in Eclipse ein gelbes Warndreieck entfernt habe, aber was macht es? Und Sie haben diese Zeile auch ersetzt: getContentPane(). Add (cardPanel, BorderLayout.NORTH); whith this: hinzufügen (cardPanel, BorderLayout.NORTH); was ist der Unterschied? Und schließlich könntest du auch nett sein und erklären, was du in der Hauptmethode getan hast? Vielen Dank! –

8

Es ist sehr wahrscheinlich zu initialisieren, dass Sie zeigen anrufen() auf der JPanel, anstatt das Cardlayout.

Die Methode show() existiert in JPanel (genauer Component) und wurde durch setVisible() ersetzt. Dies unterscheidet sich grundlegend von der show() -Methode von CardLayout.

Stellen Sie sicher, so etwas wie die folgenden in Ihrer Aktion Hörer

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

Als Randnotiz tun, tut es erscheinen Sie „newing“ Ihre Cardlayout sind. Stellen Sie sicher, dass Sie das tun.

+0

Ja, ich vermisste mein CardLayout "neu" und ich machte auch einige Fehler mit Show! Vielen Dank! –