3

我想知道这个问题很长时间了。

JFrame我通常通过将包含窗口内容的aJPanel设置为内容窗格来构建我的 SWING 程序setContentPane()。当我希望将我的内容替换为另一个内容时(例如,单击按钮后获取新蒙版),我setContentPane()再次调用并将内容窗格替换为另一个面板。但是每次我这样做时,我都需要调用repaint()后才setContentPane()能使更改可见,所以我创建了一个自己的类用于创建框架。此类扩展JFrame和覆盖setContentPane()如下:

@Override
public void setContentPane(Container c) {
  super.setContentPane(c);
  revalidate();
  repaint();
}

为什么这没有在默认JFrame类中实现?这样做可能会产生不好的副作用吗?

4

1 回答 1

4

我认为这是出于同样的原因,在从Container. 设置内容窗格与将组件添加到已经存在的窗格相同。组件层次结构变得无效,因此您必须调用revalidate()and repaint()

文档中建议了它不自动调用的原因Container.validate()

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

但这只是我的猜测。

于 2015-02-24T11:18:53.293 回答