我'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 回答
每次执行remove()或removeAll()时,都应该调用
完成add()新组件后 .
执行remove()时,必须调用validate()或revalidate() - 请参阅相关的javadoc .
我自己的测试表明repaint()也是必要的 . 我不确定为什么 .
你需要调用
repaint()
和revalidate()
. 前者告诉Swing窗口的一个区域是脏的(这是擦除由removeAll()
删除的旧孩子的图像所必需的);后者告诉布局管理器重新计算布局(添加组件时这是必要的) . 这应该会导致面板的子节点重新绘制,但可能不会导致面板本身这样做(请参阅this以获取重绘触发器列表) .更一般地说:我不建议重新使用原始面板,而是建议 Build 一个新面板并将它们交换到父面板 .
添加新组件或删除旧组件后,将在容器上调用
revalidate
. 此调用是指示布局管理器基于新组件列表重置的指令 .revalidate
将触发调用以重新绘制组件认为的内容'dirty regions.'显然JPanel
上的所有区域都不被RepaintManager
视为脏 .repaint
用于告诉组件重绘自身 . 通常情况下,您需要调用此方法来清理诸如您的条件 .revalidate()
只是请求布局容器,当您遇到简单调用revalidate()
工作时,它可能是由更新子组件引起的,当重新布局期间更改其边界时,边界会触发repaint()
. 在您提到的情况下,只删除了组件并且没有更改组件边界,这种情况没有触发repaint()
.是的你需要调用repaint();重新验证();当你调用removeAll()然后你必须调用repaint()和revalidate()