How to show different cards in a CardLayout?

穿精又带淫゛_ 提交于 2019-11-28 10:24:16

EDIT (I tried your code example)

1.you forgot to initialize most important variable

private CardLayout cardLayout = new CardLayout();

2.then SSCCE could be

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

It is most likely that you are calling show() on the JPanel, rather than the CardLayout.

The method show() used to exist in JPanel (more specifically Component) and has been replaced by setVisible(). This is completely different from the show() method of CardLayout.

Make sure you are doing something like the following in your action listener

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

As a side note, it doesnt appear you are "newing" your CardLayout. Make sure you do that.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!