java窗口的repaint_Java Swing revalidate()与repaint()

我将一个Swing应用程序放在一起,我经常想替换JPanel的内容。 为此,我先调用removeAll(),然后添加我的新内容,然后调用revalidate()。

但是我发现旧内容实际上仍然可见(尽管被新内容遮盖了)。 如果我在revalidate()之外添加了对repaint()的调用,它将按预期工作。

我确信在其他情况下,我已经经历过只需调用revalidate()就足够了。

因此,基本上我的问题是-我需要同时调用这两个函数吗?如果不需要,何时应分别调用它们?

Oracle的本教程指出:"始终在重新验证后调用重绘"。 虽然没有提供解释。

您需要调用repaint()和revalidate()。前者告诉Swing窗口的区域很脏(这是擦除被removeAll()删除的旧孩子的图像所必需的);后者告诉布局管理器重新计算布局(添加组件时这是必需的)。这将导致面板的子项重新绘制,但可能不会导致面板本身进行重新绘制(有关重新绘制触发器的列表,请参见此内容)。

总的来说,我建议不要建立原始面板,而建议重新构建面板,并在父面板上交换它们。

您能否合理说明为什么建立一个新的面板比使用旧面板更好的解决方案? :)

@Arttu-它的工作量少,因此不易出错。

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

validate();

repaint();

完成add()后,添加新组件。

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

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

一旦添加了新组件或删除了旧组件,就会在容器上调用revalidate。该调用是告诉布局管理器根据新组件列表进行重置的指令。 revalidate将触发调用以重绘组件认为是"脏区"的内容。显然,RepaintManager并不认为您的JPanel上的所有区域都是脏区域。

repaint用于告诉组件重新绘制自身。通常情况下,您需要调用此命令来清理诸如您的情况。

revalidate()只是请求对容器进行布局,当您体验简单地调用revalidate()时,可能是由于子组件边界的更新触发了repaint()的原因,而子组件边界在重新布局期间更改了边界时会触发repaint()。在您提到的情况下,仅删除了组件且未更改组件边界,在这种情况下,没有"偶然"触发repaint()。

是的,你需要打电话

repaint();

revalidate();

当您调用removeAll()时,您必须调用repaint()和revalidate()

这与被接受的答案有何不同?

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值