2012-05-30 9 views
6

Miré a un ejemplo de código que utiliza este código:¿Cómo mostrar diferentes tarjetas en un CardLayout?

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

Pero cuando se utiliza show recibo un mensaje en Eclipse que está obsoleto y me pregunto si hay otra manera de mostrar las diferentes tarjetas en el CardLayout cuando hago clic en los botones? A continuación está el código para mi clase CardLayout. Las sugerencias también son bienvenidas si alguna parte del código es una mala práctica. ¡Gracias!

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

Respuesta

13

EDITAR (probé el ejemplo de código)

1.you olvidó inicializar la variable más importante

private CardLayout cardLayout = new CardLayout(); 

SSCCE 2. A continuación, podría ser

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

¡Gracias por el nuevo código! ¡Está funcionando bien! Pero tengo algunas preguntas sobre algunas líneas que ha agregado, como esta: private static final serial serialVersionUID = 1L; Puedo ver que eliminé un triángulo de alerta amarilla en Eclipse, pero ¿qué está haciendo? Y también reemplazó esta línea: getContentPane(). Add (cardPanel, BorderLayout.NORTH); con esto: agregue (cardPanel, BorderLayout.NORTH); ¿cual es la diferencia? Y finalmente, ¿podrías ser amable y explicar lo que has hecho en el método principal? ¡Gracias! –

8

Lo más probable es que está llamando show() en el JPanel, en lugar de la CardLayout.

El método show() solía existir en JPanel (más específicamente Component) y ha sido reemplazado por setVisible(). Esto es completamente diferente del método show() de CardLayout.

Asegúrese de que está haciendo algo como lo siguiente en su oyente de action

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

Como nota al margen, es imposible parecer que se encuentra "Newing" su CardLayout. Asegúrate de hacer eso.

+0

Sí, me perdí "novedades" de mi CardLayout y también hice algunos errores con el programa. ¡Gracias! –

Cuestiones relacionadas