我将一个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/