单击按钮后更改Frame的内容窗格

我希望能够在单击该框架的一个JPanels中的按钮后设置JFrame的contentpane。

我的架构由一个控制器组成,该控制器创建JFrame和它内部的第一个JPanel。 从第一个JPanel中我调用一个方法:setcontentpane(JPanel jpanel)在控制器上。 但是,它不是加载传递的JPanel,而是删除所有面板(参见下面的代码)

第一个JPanel里面的ActionListener:

public void actionPerformed(ActionEvent arg0) { controller.setpanel(new CustomPanel(string1, string2)); } 

控制器:

 JFrame frame; public void setpanel(JPanel panel) { frame.getContentPane().removeAll(); frame.getContentPane().add(panel); frame.repaint(); } public Controller(JFrame frame) { this.frame=frame; } 

谁能告诉我我做错了什么? 谢谢 :)

调用revalidate,然后重新绘制。 这告诉布局管理器执行其组件的布局:

 JPanel contentPane = (JPanel) frame.getContentPane(); contentPane.removeAll(); contentPane.add(panel); contentPane.revalidate(); contentPane.repaint(); 

更好的是,如果你只是想交换JPanels就是使用CardLayout并让它完成肮脏的工作。

我找到了一种方法来做我上面概述的内容。

像这样实现setpanel方法:

 public void setpanel(JPanel panel) { frame.setContentPane(panel); frame.validate(); } 

在我的情况下做了伎俩。

我很确定我仍然需要在我的代码中修改一些东西(关于布局管理器和首选大小,因为pack()仍会缩小窗口),但至少上面发布的方法可以正常工作:)

每当更改框架的包含层次结构时,都必须调用pack()

来自文档:

使此窗口的大小适合其子组件的首选大小和布局。 […]在计算preferredSize后,将validation窗口。