I want to be able to set a JFrame\'s contentpane after a button inside one of that frame\'s JPanels has been clicked.
My architecture consists of a controller which
Whenever you change a frame's containment hierarchy, you have to call pack()
.
From the docs:
Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. [...] The Window will be validated after the preferredSize is calculated.
I found a way to do what I outlined above.
Implementing the setpanel method like this:
public void setpanel(JPanel panel)
{
frame.setContentPane(panel);
frame.validate();
}
did the trick in my case.
I'm sure that I still need to fix something within my code, since pack() still shrinks the window, but at least the method posted above works.
Call revalidate, then repaint. This tells the layout managers to do their layouts of their components:
JPanel contentPane = (JPanel) frame.getContentPane();
contentPane.removeAll();
contentPane.add(panel);
contentPane.revalidate();
contentPane.repaint();
Better though if you just want to swap JPanels is to use a CardLayout and have it do the dirty work.