单击按钮后更改Frame的contentpane

时间:2011-05-15 20:07:51

标签: java swing

我希望能够在单击该框架的某个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;
}

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

3 个答案:

答案 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之后验证   计算。