How to show different cards in CardLayout?

I looked at a sample code that used this code:

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

But when I use show , I get a message in Eclipse that it is out of date, and I wonder if there is another way to show different cards in CardLayout when I click the buttons? Below is the code for my CardLayout class. Suggestions are also welcome if some piece of code is bad practice. 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); } } 
+6
source share
2 answers

EDIT (I tried your sample code)

1. You forgot to initialize the most important variable

 private CardLayout cardLayout = new CardLayout(); 

2. Then SSCCE can 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); } }); } } 
+13
source

Most likely you are calling show () on JPanel, not CardLayout.

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

Make sure you do something like the following in your action listener

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

As a side note, you don't seem to be new to CardLayout. Make sure you do it.

+8
source

Source: https://habr.com/ru/post/917047/


All Articles