我将一个Swing应用程序放在一起,在这里我经常要替换JPanel的内容。为此,我先调用removeAll(),然后添加我的新内容,然后调用revalidate()

但是我发现旧内容实际上仍然可见(尽管被新内容遮盖了)。如果我除了repaint()之外还添加了对revalidate()的调用,它会按预期工作。

我确信在其他情况下,我已经经历过仅调用revalidate()就足够了。

所以基本上我的问题是-我应该同时调用这两个函数吗?如果不需要,何时应分别调用它们?

最佳答案

您需要调用repaint()revalidate()。前者告诉Swing窗口区域很脏(这对于擦除被removeAll()删除的旧 child 的图像是必需的);后者告诉布局管理器重新计算布局(添加组件时必须这样做)。这将导致面板的子项重新绘制,但可能不会导致面板本身进行重新绘制(有关重新绘制触发器的列表,请参见this)。

总的来说,我建议不要建立原始面板,而建议重新构建面板,并在父面板上交换它们。

关于java - Java Swing revalidate()与repaint(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1097366/

10-09 08:01