gpt4 book ai didi

java - Swing刷新周期

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:32 25 4
gpt4 key购买 nike

我试图了解何时使用 revalidate/repaint/pack。

令人惊讶的是,我没有找到很多详细的幕后文档(请随意链接)。

到目前为止,我明白这是 RepaintManager 的全部职责。

  • paint/repaint 指的是看起来脏/干净的东西
  • pack/validate/revalidate 指的是什么是有效的

This article on Oracle解释了调用重绘会在事件调度程序线程上排队作业,该线程将依次调用组件上的 paintImmediately()(这会重绘组件)。

This trail表示有效与否与LayoutManager相关联。而且这完全是关于组件的大小而不是内容。

  1. 是否真的应该在移动/调整组件大小时调用 revalidate 并在更改组件内容时重新绘制?
  2. pack() 方法真的是一个您永远不应该调用的已弃用的方法吗?
  3. 以上说法是否有误?

最佳答案

以下是您需要调用这些方法的一些基本情况(我介绍了基础知识,但我可能错过了其他一些需要调用这些方法的情况)。

  1. 您应该在容器上调用 revalidate(),当您有以下任一情况时:添加一个或多个组件,删除一个或多个组件,更改一个或多个包含组件的约束(约束或 XXXSize( ), 虽然不推荐后者), 改变了容器的LayoutManager
  2. 只要您希望重绘该组件(及其后代),就应该调用repaint()。最终,这将调用 paintComponent()(对于基本小部件,这将委托(delegate)给 XXXUI.paint())、paintBorder()paintChildren()(至少在 Swing 中)
  3. pack() 实际上将窗口的大小设置为其首选大小。您通常应该在使窗口可见之前立即调用它。您可以稍后调用它,但这会带来奇怪的用户体验(我不知道有多少应用程序会在显示后调整其窗口大小)

使用 revalidate()repaint() 的主要优点是它们可以合并。这意味着如果多次调用 repaint(),则绘画只会执行一次。

关于java - Swing刷新周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com