Java – add jpanels of other classes to CardLayout

I have three windows in three separate classes. I want to use CardLayout so that when you click the next button, the next window will appear How to add jpanels containing different elements to a CardLayout? This is the first window: (the only difference is the background - but it represents how I actually got it)

public class Window1 extends JPanel implements ActionListener {

static cardlayout cardlayout = new cardlayout();

public Window1() {
   init();
}

private void init() {
    JPanel jp = new JPanel(new BorderLayout());
    JPanel jp2 = new Window2();
    //JPanel jp3 = new Window3();
    JLabel textLabel = new JLabel("Window1");
    jp.setBackground(Color.GREEN);
    jp.add(textLabel,BorderLayout.CENTER);
    JButton nextButton = new JButton("NEXT");
    nextButton.setActionCommand("next");
    nextButton.addActionListener(this);
    jp.add(nextButton,BorderLayout.EAST);
    setLayout(cardlayout);
    add(jp,"string");
    add(jp2,"string");
    //add(jp3,"string");
}

public void actionPerformed(ActionEvent e) {            
    if (e.getActionCommand().equalsIgnoreCase("next")) {
    // go to the next window
        cardlayout.next(this);
    }
}

private static void createAndShowGUI() {        
      JFrame frame = new JFrame("test");
      frame.getContentPane().setLayout(Window1.cardlayout);
      frame.getContentPane().add(new Window1(),"Center");
      frame.getContentPane().add(new Window2(),"Center");
      frame.getContentPane().add(new Window3(),"Center");
      frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(550,450);
      frame.setVisible(true); 
}


public static void main(String[] args) {
    java.awt.EventQueue.invokelater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }           
    });
}
}

Second window:

public class Window2 extends JPanel implements ActionListener {

//static cardlayout cardlayout = new cardlayout();

public Window2() {
   init();
}

private void init() {
    setLayout(new BorderLayout());
    JLabel textLabel = new JLabel("Window2");
    setBackground(Color.RED);
    add(textLabel,BorderLayout.CENTER);
    JButton nextButton = new JButton("NEXT");
    nextButton.setActionCommand("next");
    nextButton.addActionListener(this);
    add(nextButton,BorderLayout.EAST);
    //setLayout(cardlayout);
    //JPanel jp3 = new Window3();
    //add(jp3,"string");
}

public void actionPerformed(ActionEvent e) {            
    if (e.getActionCommand().equalsIgnoreCase("next")) {
    // go to the next window??
        System.out.println("window2");
        Window1.cardlayout.next(this);
    }
}

}

the last one:

public class Window3 extends JPanel implements ActionListener {

public Window3() {
   init();
}

private void init() {
    setLayout(new BorderLayout());
    JLabel textLabel = new JLabel("Window3");
    setBackground(Color.BLUE);
    add(textLabel,BorderLayout.EAST);
}

public void actionPerformed(ActionEvent e) {            
    if (e.getActionCommand().equalsIgnoreCase("next")) {
    // go to the next window
    //  Window1.cardlayout.next(this);
    }
}

}

Solution

I made a small program. I hope the comments written in the program can guide you to know how to use CardLayout

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* Here we are first declaring our class that will act as the
 * base for other panels or in other terms the base for cardlayout.
 */

public class cardlayoutTest
{
    private static final String CARD_JBUTTON =  "Card JButton";
    private static final String CARD_JTEXTFIELD = "Card JTextField";    
    private static final String CARD_JRAdioBUTTON = "Card JRadioButton";

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Card Layout Test");
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        // This JPanel is the base for cardlayout for other JPanels.
        final JPanel contentPane = new JPanel();
        contentPane.setLayout(new cardlayout(20,20));

        /* Here we be making objects of the Window Series classes
         * so that,each one of them can be added to the JPanel 
         * having cardlayout. 
         */
        Window1 win1 = new Window1();
        contentPane.add(win1,CARD_JBUTTON);
        Window2 win2 = new Window2();
        contentPane.add(win2,CARD_JTEXTFIELD);
        Window3 win3 = new Window3();
        contentPane.add(win3,CARD_JRAdioBUTTON);

        /* We need two JButtons to go to the next Card
         * or come back to the prevIoUs Card,as and when
         * desired by the User.
         */
        JPanel buttonPanel = new JPanel(); 
        final JButton prevIoUsButton = new JButton("PREVIoUS");
        prevIoUsButton.setBackground(Color.BLACK);
        prevIoUsButton.setForeground(Color.WHITE);
        final JButton nextButton = new JButton("NEXT");
        nextButton.setBackground(Color.RED);
        nextButton.setForeground(Color.WHITE);
        buttonPanel.add(prevIoUsButton);
        buttonPanel.add(nextButton);

        /* Adding the ActionListeners to the JButton,* so that the user can see the next Card or
         * come back to the prevIoUs Card,as desired.
         */
        prevIoUsButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                cardlayout cardlayout = (cardlayout) contentPane.getLayout();
                cardlayout.prevIoUs(contentPane);
            }
        });
        nextButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                cardlayout cardlayout = (cardlayout) contentPane.getLayout();
                cardlayout.next(contentPane);   
            }
        });

        // Adding the contentPane (JPanel) and buttonPanel to JFrame.
        frame.add(contentPane,BorderLayout.CENTER);
        frame.add(buttonPanel,BorderLayout.PAGE_END);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokelater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
} 

class Window1 extends JPanel
{
    /*
     * Here this is our first Card of cardlayout,which will
     * be added to the contentPane object of JPanel,which
     * has the LayoutManager set to cardlayout.
     * This card consists of Two JButtons.
     */  
    private ActionListener action;

    public Window1() 
    {
        init();
    }

    private void init() 
    {
        final JButton clickButton = new JButton("CLICK ME");
        final JButton dontClickButton = new JButton("DON\'T CLICK ME");     

        action = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (ae.getSource() == clickButton)
                {
                    JOptionPane.showMessageDialog(null,"Hello there dude!","Right Button",JOptionPane.INFORMATION_MESSAGE);
                }
                else if (ae.getSource() == dontClickButton)
                {
                    JOptionPane.showMessageDialog(null,"I told you not to click me!","Wrong Button",JOptionPane.PLAIN_MESSAGE);
                }
            }
        };

        clickButton.addActionListener(action);
        dontClickButton.addActionListener(action);

        add(clickButton);
        add(dontClickButton);
    }
}

class Window2 extends JPanel implements ActionListener 
{
    /*
     * Here this is our second Card of cardlayout,which
     * has the LayoutManager set to cardlayout.
     * This card consists of a JLabel and a  JTextField
     * with GridLayout.
     */  

    private JTextField textField;

    public Window2() 
    {
        init();
    }

    private void init() 
    {
        setLayout(new GridLayout(1,2));
        JLabel userLabel = new JLabel("Your Name : ");
        textField = new JTextField();
        textField.addActionListener(this);

        add(userLabel);
        add(textField);
    }

    public void actionPerformed(ActionEvent e) 
    {            
        if (textField.getDocument().getLength() > 0)
            JOptionPane.showMessageDialog(null,"Your Name is : " + textField.getText(),"User\'s Name : ",JOptionPane.QUESTION_MESSAGE);
    }
}

class Window3 extends JPanel
{
    /*
     * Here this is our third Card of cardlayout,which
     * has the LayoutManager set to cardlayout.
     * This card consists of Two JLabels and two JCheck@R_940_2419@
     * with GridLayout.
     */  
    private ActionListener state;

    public Window3()
    {
        init();
    }

    public void init()
    {
        setLayout(new GridLayout(2,2));
        JLabel maleLabel = new JLabel("MALE",JLabel.CENTER);
        final JCheck@R_940_2419@ male@R_940_2419@ = new JCheck@R_940_2419@();
        JLabel femaleLabel = new JLabel("FEMALE",JLabel.CENTER);
        final JCheck@R_940_2419@ female@R_940_2419@ = new JCheck@R_940_2419@();

        state = new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                if (male@R_940_2419@ == (JCheck@R_940_2419@) ae.getSource())
                {
                    female@R_940_2419@.setSelected(false);
                    JOptionPane.showMessageDialog(null,"Congrats you are a Male","Gender : ",JOptionPane.INFORMATION_MESSAGE);                            
                }
                else if (female@R_940_2419@ == (JCheck@R_940_2419@) ae.getSource())
                {
                    male@R_940_2419@.setSelected(false);
                    JOptionPane.showMessageDialog(null,"Congrats you are a Female",JOptionPane.INFORMATION_MESSAGE);                        
                }
            }
        };

        male@R_940_2419@.addActionListener(state);
        female@R_940_2419@.addActionListener(state);
        add(maleLabel);
        add(male@R_940_2419@);
        add(femaleLabel);
        add(female@R_940_2419@);
    }
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>