我希望能够在单击该框架的某个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;
}
谁能告诉我我做错了什么?谢谢:))
答案 0 :(得分:16)
调用revalidate,然后重新绘制。这告诉布局管理器要对其组件进行布局:
JPanel contentPane = (JPanel) frame.getContentPane();
contentPane.removeAll();
contentPane.add(panel);
contentPane.revalidate();
contentPane.repaint();
更好但是如果你只想交换JPanels就是使用CardLayout并让它做脏事。
答案 1 :(得分:3)
我找到了一种方法来完成我上面概述的内容。
实现这样的setpanel方法:
public void setpanel(JPanel panel)
{
frame.setContentPane(panel);
frame.validate();
}
在我的案例中做了伎俩。
我很确定我仍然需要在我的代码中修改一些内容(关于布局管理器和首选大小,因为pack()仍会缩小窗口),但至少上面发布的方法可以正常工作:)< / p>
答案 2 :(得分:2)
每当您更改框架的包含层次结构时,都必须调用pack()
。
来自文档:
使此窗口的大小适合 它的首选尺寸和布局 子。 [...]窗口会 在preferredSize之后验证 计算。