Geetanjali
Geetanjali

Reputation: 1043

problem in nested Jpanel over Jframe

I have a JFrame and a Jpanel over that in which various buttons are placed.so on click of a button I have called a new class which is also having containers placed in a Jpanel.so I want to show that new class panel over the main Jframe panel.How can I do that?

And if we use card layout in it then how can i use that as on click button i have called an object of a new class. as

Card layout consider each component in a container as card and i want whole Jpanel as a card so is it possible to do that???

Can We do nesting of Jpanels in it?

Please suggest me a right way to do that?

here is SSCCE:

// this is the  main class on which i want to use panel of other class
public class mymain 
{
    JFrame jframe =  new JFrame();
    JPanel panel = new JPanel();
    BorderLayout borderlayout = new BorderLayout();

public mymain()
{
    jframe.setLayout(borderlayout);
    JMenuBar menubar = new JMenuBar();
    jframe.setJMenuBar(menubar);

    JButton home_button = new JButton("HOME");
    menubar.add(home_button);
    jframe.getContentPane().add(panel,BorderLayout.CENTER);             
    panel.setLayout(new GridBagLayout());

    //here used containers over that frame              
             and call it from main()

}

here is another class to manage category is 

public class manageCategory 
{
JPanel panel = new JPanel();
GridBagLayout gridbglayout = new GridBagLayout();
GridBagConstraints gridbgconstraint = new GridBagConstraints();
public manageCategory()
{
            panel.setLayout(new BorderLayout());
    // i have again here used containers placed with grid bag layout
}

}

So now i want that as i click on home button used in mymain class then the panel that is used in manageCategory() should be displayed on the same panel.and when i again click on home button then the mymain panel get displayed.how can i do that???

Upvotes: 5

Views: 2123

Answers (3)

Eternal_Light
Eternal_Light

Reputation: 686

You can

 JFrame myFrame = new JFrame();
 JPanel panel1 = new JPanel();
 Panel1.setVisible(true);
 myFrame.add(panel1);


 JPanel panel2 = new JPanel();
 Panel2.setVisible(false);
 myFrame.add(panel2);

 //Here you setup your panels and your actionlisteners etc and when
 //you wish for your second panel to show up just run the code below.

 panel1.setVisible(false);
 panel2.setVisible(true);

Obviously you first have to add both panels to your Jframe. Panel1 will be at first visible, as it is the one shown by default. Panel2 must be set to be invisible in the beginning.

Upvotes: 1

dacwe
dacwe

Reputation: 43504

I would advise you to use a CardLayout for this task.


Updated example with JPanel and "classes":

static class MainPanel extends JPanel {
    public MainPanel(final Container frame) {
        add(new JButton(new AbstractAction("Click to view next") {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.add(new NextPanel(), "NextPanel");
                ((CardLayout) frame.getLayout()).show(frame, "NextPanel");
            }
        }));
    }
}

static class NextPanel extends JPanel {
    public NextPanel() {
        add(new JLabel("Next page in the card layout"));
    }
}

public static void main(String[] args) throws Exception {
    JFrame frame = new JFrame("Test");
    frame.setLayout(new CardLayout());
    frame.add(new MainPanel(frame.getContentPane()), "MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}

Upvotes: 3

mKorbel
mKorbel

Reputation: 109823

CardLayout is one of possible ways, but there are another options valid or required by most completed GUI

1) BorderLayout, because there only one JComponent can occupate decision area

someContainer.add(myPanel, BorderLayout.CENTER) 
revalidate();
repaint();

2) GridBagLayout

before anything you have to get declared GridBagConstraints from myOldComponent layed by GridBagLayout

myContainer.setVisible(myOldComponent);
//or
myContainer.remove(myOldComponent);

myContainer.add(myNewComponent, gbc);
revalidate();
repaint();

Upvotes: 1

Related Questions