【问题标题】:separate repaints in awt在awt中单独重绘
【发布时间】:2011-06-14 08:20:17
【问题描述】:

“AWT 和 Swing 中的绘画”文档说明如下。

“如果在处理初始重绘请求之前在一个组件上发生了多次 repaint() 调用,则多个请求可能会合并为一次 update() 调用。”

是否可以在组件中更改此行为,以便多次调用重绘永远不会合并为一次调用?

编辑:文档进一步说明了这一点,“确定何时应折叠多个请求的算法取决于实现。”

我的问题是我在一个单独调用重绘的移动平台上,我试图在桌面上复制该行为。

【问题讨论】:

  • 您为什么要这样做?听起来您正在更新绘画方法中的状态......这听起来像一个真的坏主意。
  • 为什么要改变这种行为?这似乎是处理积压的重绘调用的最佳方式。致aioobe:这正是我的想法,他的程序逻辑出现在paint方法中。
  • 为您的移动设备获取一个模拟器,而不是尝试在另一个实现中复制它。它永远不会在那里表现得完全一样。 (理想情况下,您的代码不应依赖于对updatepaint()paintComponent() 的调用次数。)

标签: java awt


【解决方案1】:

我猜你有一些长时间运行的任务正在循环,而不是像你期望的那样更新 GUI。这可能是因为您阻塞了 Event Dispatch Thread,因此 Swing 无法自行重绘。

阅读 Concurrency in Swing 上的 Swing 教程部分。将 SwingWorker 用于长时间运行的任务,以免阻塞 EDT,然后您可以发布结果和要求,它们将按预期绘制。

或者,如果您的问题与动画有关,请使用 Swing Timer。本教程还有一个关于计时器的部分。

【讨论】:

    【解决方案2】:

    我担心绘画算法在 swing/awt 中是相当硬编码的,它们只为不同的目的提供不同的钩子。您可以在 swing 中使用 this 方法,它可以提供您想要的东西,但遗憾的是似乎没有 awt 等价物。您可以尝试混合 awt/swing,但通常不建议这样做,并且在某些情况下可能会导致奇怪的行为,正如我所听到的那样

    PS:对于问你为什么想要这个的人:一些应用程序(主要是游戏)需要同步重绘以确保它们的视觉外观跟上内部状态 - 例如,JScrollbar 也在内部使用它(我没有'没有查看有问题的代码,所以对它持保留态度 - 我确实理解为什么它在特定情况下可能有用)

    【讨论】:

    • 好吧,我看到只有一个自定义树表只有一个实现
    • @mKorbel 我在某处听说 JScrollBar 在内部使用它,我可以遵循它背后的逻辑,但我没有看过代码,所以我没有把它作为一个确定的事实放在那里- 但可能不是特别好 - 我希望添加的注释能更清楚:)
    • 不幸的是,我正在开发的移动平台不支持 Swing。它只支持 AWT。我使用的平台会单独调用重绘,因此我尝试仅使用 AWT 复制桌面上的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2019-07-18
    • 2021-04-19
    • 2010-10-08
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多