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

Java 为什么setContentPane()不包含repaint()?,java,swing,jframe,contentpane,Java,Swing,Jframe,Contentpane,我很长时间都在想这个问题 我通常通过使用JFrame和JPanel构建SWING程序,其中包含由setContentPane()设置为内容窗格的窗口内容。当我希望我的内容被另一个内容替换时(例如,为了在单击按钮后获得新的掩码),我再次调用setContentPane(),并用另一个面板替换内容窗格。但每次我这样做时,我都需要在setContentPane()之后调用repaint(),以使更改可见,因此我创建了一个自己的类,用于创建框架。此类扩展了JFrame并覆盖了setContentPane

我很长时间都在想这个问题

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

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

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

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

文档中建议了未自动调用它的原因:

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


但这只是我的猜测。

您使用什么布局管理器?为什么要使用它?一般来说,您应该按原样设置并保留内容窗格。您可能还需要对UI进行更多的更改,在完成之前您不想计划重新绘制……您还要求将其追溯到设计和编写API的开发人员的15多年前。这些需求与我们今天的需求有很大的不同,只需看看JavaFX在概念上的差异就可以了example@MadProgrammer:为什么要在setContentPane()之后进行更改?我完全准备好了新的面具,所以我的“主面板”中有了全新的面具。在此之后,我调用setContentPane()。这是我正在做的最后一步。@Foxx因为我不认为这是设计师对
setContentPane
的想法,他们的想法是“设置”一次,然后修改
contentPane
本身的内容。再一次,你在问设计师们最初的想法是什么。好吧,但我总是先在一个面板中构建我的完全完成的掩码,当我完成后,我最终将这个面板设置为我JFrame的内容窗格。所以我通常只会对每个用户操作调用一次。我无法想象一种干净的方式以不同的方式使用setContentPane()。我认为这就是它的目的。您可以设置内容窗格,然后在其后添加组件。这没什么错。就像
Container.add一样
您可以随时调用
setContentPane
。没有规定它必须总是最后一个。嗯。。。是的,没错。我只是觉得这是一步一步做的最好方法,而我的最后一步就是每次都设置ContentPane()。但好吧,我接受它……;)但是当像我一样使用setContentPane()时,从开始的文章中使用我的方法应该可以,对吗?我看不出有什么副作用。是的,很好。虽然正如Andrew Thompson所建议的,但是你应该考虑使用<代码>卡片布局< /代码>。重置整个内容窗格可能需要更长的时间,这在GUI中是一个短暂的停顿。