我正在开发一个 Swing 应用程序,经常需要替换 JPanel 的内容。为此,我调用 removeAll()
方法,然后添加新的内容,最后调用 revalidate()
方法。
但是我发现旧内容仍然可见(被新内容遮挡)。如果我同时调用 repaint()
和 revalidate()
方法,则可以按预期工作。
我确定在其他情况下只需要调用 revalidate()
方法就足够了。
所以我的问题基本上是,我是否需要同时调用这两个函数,如果不需要,应该在什么时候调用它们?
我正在开发一个 Swing 应用程序,经常需要替换 JPanel 的内容。为此,我调用 removeAll()
方法,然后添加新的内容,最后调用 revalidate()
方法。
但是我发现旧内容仍然可见(被新内容遮挡)。如果我同时调用 repaint()
和 revalidate()
方法,则可以按预期工作。
我确定在其他情况下只需要调用 revalidate()
方法就足够了。
所以我的问题基本上是,我是否需要同时调用这两个函数,如果不需要,应该在什么时候调用它们?
repaint()
和revalidate()
。 第一个告诉Swing窗口中的某个区域已经变脏(这对于擦除removeAll()
删除的旧子对象的图像是必要的);第二个告诉布局管理器重新计算布局(当添加组件时是必要的)。这应该导致此面板的子元素重新绘制,但可能不会导致面板本身这样做(请参见此获取刷新触发器列表)。 validate();
repaint();
在完成添加新的组件后,必须调用validate()或revalidate()函数。这是因为当你使用remove()时需要查看相关的Java文档。
经过我的测试显示,repaint()也是必要的,但我不确定原因。
revalidate
在添加新组件或移除旧组件后会被调用。这个调用是一个指令,告诉布局管理器基于新的组件列表进行重置。 revalidate
将触发对组件认为是“脏区域”的重绘调用 。显然,并非您的JPanel
上的所有区域都被RepaintManager
视为脏区域。
repaint
用于让组件重新绘制自己。经常需要调用它来清理类似您的情况。
revalidate()
方法会请求重新布局容器,当你遇到需要简单地调用 revalidate()
方法时,可能是由于子组件的更新触发了 repaint()
方法,在重新布局期间改变它们的边界。在你提到的情况中,只有组件被移除而没有组件边界被更改,这种情况下不会“意外”触发 repaint()
方法。
是的,当你调用 removeAll() 方法时,你需要调用 repaint() 和 revalidate() 方法。