首页 文章

Java Swing revalidate()vs repaint()

提问于
浏览
199

我'm putting together a Swing application where I often want to replace the contents of a JPanel. To do this, I' m调用 removeAll() ,然后添加我的新内容,然后调用 revalidate() .

但是我发现旧内容仍然可见(虽然被新内容遮挡了) . 如果我在 revalidate() 之外添加对 repaint() 的调用,它会按预期工作 .

我有经验,只需拨打_540362就足够了 .

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

5 回答

  • 149

    每次执行remove()或removeAll()时,都应该调用

    validate();
      repaint();
    

    完成add()新组件后 .

    执行remove()时,必须调用validate()或revalidate() - 请参阅相关的javadoc .

    我自己的测试表明repaint()也是必要的 . 我不确定为什么 .

  • 56

    你需要调用 repaint()revalidate() . 前者告诉Swing窗口的一个区域是脏的(这是擦除由 removeAll() 删除的旧孩子的图像所必需的);后者告诉布局管理器重新计算布局(添加组件时这是必要的) . 这应该会导致面板的子节点重新绘制,但可能不会导致面板本身这样做(请参阅this以获取重绘触发器列表) .

    更一般地说:我不建议重新使用原始面板,而是建议 Build 一个新面板并将它们交换到父面板 .

  • -4

    添加新组件或删除旧组件后,将在容器上调用 revalidate . 此调用是指示布局管理器基于新组件列表重置的指令 . revalidate 将触发调用以重新绘制组件认为的内容'dirty regions.'显然 JPanel 上的所有区域都不被 RepaintManager 视为脏 .

    repaint 用于告诉组件重绘自身 . 通常情况下,您需要调用此方法来清理诸如您的条件 .

  • 81

    revalidate() 只是请求布局容器,当您遇到简单调用 revalidate() 工作时,它可能是由更新子组件引起的,当重新布局期间更改其边界时,边界会触发 repaint() . 在您提到的情况下,只删除了组件并且没有更改组件边界,这种情况没有触发 repaint() .

  • 2

    是的你需要调用repaint();重新验证();当你调用removeAll()然后你必须调用repaint()和revalidate()

相关问题