我希望能够在单击JFrame的JPaels中的一个按钮后设置该框架的内容窗格。
我的架构由一个控制器组成,该控制器创建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;
}
谁能告诉我我做错了什么?谢谢:)
调用重新验证,然后重新绘制。这告诉布局管理器对组件进行布局:
JPanel contentPane = (JPanel) frame.getContentPane();
contentPane.removeAll();
contentPane.add(panel);
contentPane.revalidate();
contentPane.repaint();
如果你只想交换JPanells,更好的是使用CardLayout并让它做肮脏的工作。
我找到了一种方法来做我上面概述的事情。
像这样实现 setpanel 方法:
public void setpanel(JPanel panel)
{
frame.setContentPane(panel);
frame.validate();
}
在我的情况下做到了。
我确定我仍然需要修复代码中的某些内容,因为 pack() 仍然会缩小窗口,但至少上面发布的方法有效。
每当更改帧的包含层次结构时,都必须调用 pack()
。
从文档中:
使此窗口的大小适合 其首选大小和布局 子组件。[...]窗口将 在首选大小之后进行验证 被计算出来。