单击按钮后更改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窗口。