IAM
IAM

Reputation: 955

Swing: Start second JPanel, when the first JPanel is clicked

I'm writing a simple java game and I'm facing this problem:

My different layouts are in different JPanels (1 JPanel for the welcoming page, where I have to press 'start game' and another one with the actuall functionallity)

I start the game from a JFrame

import javax.swing.JFrame;

public class RType extends JFrame {

    public RType() {

        add(new Welcome());//first panel
        add(new Board());//panel with the game

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(100, 100);
        setResizable(false);
        setVisible(true);

    }

    public static void main(String[] args) {
        new RType();
    }
}

obviuosly, this launches the second panel right after the first, and I cant see the first one. I've tried some stuff, trying to invoke the second panel in the main method, when the first panel is clicked that way:

RType rt=new RType();
rt.add(new Board()); //in this case add(new Board()); is removed from constructor

but it's doing nothing. how can I solve it?

Upvotes: 0

Views: 1042

Answers (4)

Himanshu Goyal
Himanshu Goyal

Reputation: 15

on first panel of welcome add a button, and apply actionperformed like

    JButton myButton = new JButton("Add Component ");
    myButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            frame.remove(welcome);
            frame.add(Board, BorderLayout.CENTER);
            frame.revalidate();
            frame.repaint();
            }
   });

Upvotes: 2

nachokk
nachokk

Reputation: 14413

I don't recommend to add directly to the JFrame components, instead use another container as JPanel . JFrame default layout is BorderLayout, when you add in the way you are adding it always put in the center.

Make something like this:

JFrame frame = new JFrame();
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new CardLayout());
mainPanel.add(new Welcome(), "Welcome");
mainPanel.add(new Board(),"Board");
frame.add(mainPanel);

Here is a tutorial How to use CardLayout

Upvotes: 3

Daniel Kaplan
Daniel Kaplan

Reputation: 67320

As @nachokk has said, you should be using a CardLayout instead. It lets you do things like tabs in a browser, but you don't need to make the tabs visible for your game if you don't want to. You make your welcome "card" visible at first, then when the user clicks you switch to the Board "card".

enter image description here

Upvotes: 4

Kon
Kon

Reputation: 10810

By default, both panels will fill up the entire Frame's area. To fix this, you will need to use another layout, such as a GridLayout to structure the areas in which the panels will take up the Frame's area.

You can also go with no layout to hard code the pixel values of where you want the panels to fit in your frame.

EDIT: Based on what you're looking to do, the CardLayout is probably what you'll want to use for your Frame's layout.

Upvotes: 1

Related Questions