我想知道很长时间了。

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

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

为什么在默认的ojit_code类中未实现此功能?这样做会不会带来不良的副作用?

最佳答案

我认为是出于同样的原因,在Container中添加或删除组件后未调用它。设置内容窗格将与向现有组件添加组件相同。组件层次结构变为无效,因此您必须调用revalidate()repaint()
Container.validate() 的文档中建议了为什么不自动调用它的原因:

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

但这只是我的猜测。

09-27 21:07