我现在很长一段时间都在想这件事。
我通常通过JFrame
JPanel
来构建我的SWING程序,其中setContentPane()
将窗口的内容设置为setContentPane()
的内容窗格。当我希望我的内容被另一个内容替换时(例如,在单击按钮后获取新的掩码)我再次调用repaint()
并用另一个面板替换内容窗格。但是每次我这样做,我都需要在setContentPane()
之后调用JFrame
来使更改可见,所以我创建了一个自己用于创建框架的类。此类扩展setContentPane()
并覆盖@Override
public void setContentPane(Container c) {
super.setContentPane(c);
revalidate();
repaint();
}
,如下所示:
JFrame
为什么在默认的{{1}}课程中没有实现?这样做可能会产生不良副作用吗?
答案 0 :(得分:4)
我认为这是因为在添加或删除Container
中的组件后未调用它的原因相同。设置内容窗格与将组件添加到现有窗格中的组件相同。组件层次结构变为无效,因此您必须致电revalidate()
和repaint()
。
Container.validate()
的文档中提出了自动调用它的原因:
验证容器可能是非常耗时的操作。出于性能原因,开发人员可以推迟层次结构的验证,直到一组与布局相关的操作完成,例如,将所有孩子添加到容器后。
但这只是我的猜测。