Implementing CardLayout within a JFrame and switching cards based on specific button presses

后端 未结 1 1550
梦谈多话
梦谈多话 2021-01-16 16:48

I\'ve posted my code below. I have the simple task of creating a navigable GUI. I\'ve spent the past few hours doing research on how to accomplish this, and this is the code

1条回答
  •  清酒与你
    2021-01-16 17:06

    You create a JPanel that uses CardLayout, cards, but you add it to nothing, so it will of course not display itself, nor its cards. Solution: add this JPanel to your GUI.

    So instead of:

    main.setContentPane(welcomePanel());
    

    do:

    main.setContentPane(cards);
    

    Issue number 2:

    Use String constants when using Strings as a type of key. Note that you add one JPanel to the cards JPanel thusly:

    cards.add(home, "Home");
    

    But then try to display it like so:

    cl.show(cards, "home");
    

    But Home isn't the same as home.

    Instead declare a constant, HOME:

    public static final String HOME = "home";
    

    and use the same constant to add the JPanel and to display it.

    For a simplistic example:

    import java.awt.CardLayout;
    import java.awt.event.ActionEvent;
    
    import javax.swing.*;
    
    public class MainGui2 extends JPanel {
        private CardLayout cardLayout = new CardLayout();
        private WelcomePanel welcomePanel = new WelcomePanel(this);
        private HomePanel homePanel = new HomePanel();
    
        public MainGui2() {
            setLayout(cardLayout);
            add(welcomePanel, WelcomePanel.NAME);
            add(homePanel, HomePanel.NAME);
        }
    
        public void showCard(String name) {
            cardLayout.show(this, name);
        }
    
        private static void createAndShowGui() {
            MainGui2 mainPanel = new MainGui2();
    
            JFrame frame = new JFrame("MainGui2");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGui();
                }
            });
        }
    
    }
    
    class WelcomePanel extends JPanel {
        public static final String NAME = "welcome panel";
        private MainGui2 mainGui2;
    
        public WelcomePanel(final MainGui2 mainGui2) {
            this.mainGui2 = mainGui2;
            add(new JLabel(NAME));
            add(new JButton(new AbstractAction("Logon") {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    mainGui2.showCard(HomePanel.NAME);
                }
            }));
        }
    }
    
    class HomePanel extends JPanel {
        public static final String NAME = "home panel";
    
        public HomePanel() {
            add(new JLabel(NAME));
        }
    }
    

    0 讨论(0)
提交回复
热议问题