为什么setContentPane()不包含repaint()?

时间:2015-02-24 11:01:02

标签: java swing jframe contentpane

我现在很长一段时间都在想这件事。

我通常通过JFrame JPanel来构建我的SWING程序,其中setContentPane()将窗口的内容设置为setContentPane()的内容窗格。当我希望我的内容被另一个内容替换时(例如,在单击按钮后获取新的掩码)我再次调用repaint()并用另一个面板替换内容窗格。但是每次我这样做,我都需要在setContentPane()之后调用JFrame来使更改可见,所以我创建了一个自己用于创建框架的类。此类扩展setContentPane()并覆盖@Override public void setContentPane(Container c) { super.setContentPane(c); revalidate(); repaint(); } ,如下所示:

JFrame

为什么在默认的{{1}}课程中没有实现?这样做可能会产生不良副作用吗?

1 个答案:

答案 0 :(得分:4)

我认为这是因为在添加或删除Container中的组件后未调用它的原因相同。设置内容窗格与将组件添加到现有窗格中的组件相同。组件层次结构变为无效,因此您必须致电revalidate()repaint()

Container.validate()的文档中提出了自动调用它的原因:

  

验证容器可能是非常耗时的操作。出于性能原因,开发人员可以推迟层次结构的验证,直到一组与布局相关的操作完成,例如,将所有孩子添加到容器后。

但这只是我的猜测。