Java Swing revalidate() vs repaint()

2022-08-31 05:53:08

我正在编写一个 Swing 应用程序,我经常想在其中替换 JPanel 的内容。为此,我正在调用 ,然后添加我的新内容,然后调用 。removeAll()revalidate()

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

我敢肯定,在其他场合,我经历过,只要打电话就足够了。revalidate()

所以基本上我的问题是 - 我是否需要调用这两个函数,如果没有,我应该何时调用每个函数?


答案 1

您需要调用 和 。前者告诉Swing,窗户的某个区域很脏(这是擦除被移除的老孩子的形象所必需的);后者告诉布局管理器重新计算布局(这在添加组件时是必需的)。这应会导致面板的级重新绘制,但可能不会导致面板本身这样做(有关重绘触发器的列表,请参阅此处)。repaint()revalidate()removeAll()

更一般地说:与其重用原始面板,我建议构建一个新面板并在父面板上交换它们。


答案 2

每当您执行 remove() 或 removeAll() 时,您应该调用

  validate();
  repaint();

在完成 add() 新组件之后。

调用 validate() 或 revalidate() 是必需的,当您执行 remove() 时 - 请参阅相关的 javadocs。

我自己的测试表明,repaint()也是必要的。我不知道究竟为什么。


推荐