Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show different cards in a CardLayout?

I looked at a code example that used this code:

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

But when I use show I get a message in Eclipse that it's deprecated and I wonder if there is another way to show the different cards in the CardLayout when I click on the buttons? Below is the code for my CardLayout class. Suggestions are also welcome if some part of the code are bad practise. Thanks!

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);
    } 
}
like image 807
3D-kreativ Avatar asked May 30 '12 19:05

3D-kreativ


People also ask

How do I switch between Jpanels in Java?

If you want to switch between two panels add those panels into another JPanel and use cardLayout. Then, before adding a JPanel remove the current one.

What is emulated by card layout?

A CardLayout object is a layout manager for a container. It treats each component in the container as a card. Only one card is visible at a time, and the container acts as a stack of cards. The first component added to a CardLayout object is the visible component when the container is first displayed.

Which best describes a card layout?

CardLayout is a special layout manager for creating the effect of a stack of cards. Instead of arranging all of the container's components, it displays only one at a time. You might use this kind of layout to implement a hypercard stack or a Windows-style set of configuration screens.

Where is the CardLayout used?

to switch between two panels. The CardLayout class helps you manage two or more components (usually JPanel instances) that share the same display space. When using CardLayout , you need to provide a way to let the user choose between the components.


2 Answers

  • I can't see that Java7 show(Container parent, String name) or Java6 show(Container parent, String name) is depreciated

  • depends if currentCard returns String from cl.show(cardPanel, "" + (currentCard));

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);
            }
        });
    }
}
like image 77
mKorbel Avatar answered Sep 23 '22 20:09

mKorbel


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.

like image 28
Sean Avatar answered Sep 23 '22 20:09

Sean