【问题标题】:Safe to use Component.repaint() outside EDT?在 EDT 外使用 Component.repaint() 安全吗?
【发布时间】:2012-04-04 21:39:03
【问题描述】:

我找不到任何官方文档说从事件调度线程(EDT)之外的另一个线程调用Component.repaint 是安全的。

是这样吗?我在哪里可以找到一些文档/代码?

【问题讨论】:

  • 好问题 +1,我的直升机视图 :-) --> a) 一切正常,直到 repaint() 没有被 Thread.sleep(int) 锁定,b) 有一些关于 isEventDispatchThread() 的主题,但这些 lins 在掠夺的 Java.Net 上丢失了 c) 同意 AWT 组件的 API 及其在 Swing 中的嵌套类

标签: java swing awt


【解决方案1】:

这是quote from an official page 声明:

以下 JComponent 方法可以安全地从任何线程调用: repaint()revalidate()、 和invalidate()repaint()revalidate() 方法队列请求 事件调度线程分别调用paint()validate()

编辑 1:


由于前面提到的链接已经转移。我发布了一个new link,虽然它可能需要更多时间才能真正知道这个页面的真实性,因为它似乎来自Java,尽管它来自一些University的服务器,可以看出从地址栏。

【讨论】:

  • 两个链接都失效了,而且我在任何地方都找不到引用的文本 :( 另请注意,这些方法是not specified to be thread safe,即使它们是...
  • 由于链接已过时here 是更新的链接。 “JComponent.repaint() 向组件的 RepaintManager 注册一个异步重绘请求,它使用 invokeLater() 将 Runnable 排队,以便稍后在事件调度线程上处理请求。”
【解决方案2】:

它是线程安全的。 RepaintManager 确保将此类调用置于事件调度线程中。

Painting in AWT and Swing ("official" documentation)

Swing 的RepaintManager 类的目的是最大化 在 Swing 包含层次结构上重绘处理的效率,以及 还实现 Swing 的“重新验证”机制(后者将是 另一篇文章的主题)。它实现了重绘机制 通过拦截 Swing 组件上的所有重绘请求(因此它们是 不再由 AWT 处理)并保持自己的状态 需要更新(称为“脏区”)。最后,它使用 invokeLater() 处理事件的待处理请求 调度线程,如“重绘”一节中所述 处理”(选项 B)。

对于大多数程序,RepaintManager 可以看作是 Swing 的一部分 内部系统,几乎可以忽略不计。但是,它的 API 为程序提供了更好地控制某些 绘画的各个方面。

【讨论】:

  • 感谢这个精彩的绘画文档,我需要这个东西很久了:-),只是找不到。好像我在等你参考它:-)
  • @GagandeepBali:我也依赖它。一种方便的查找方法是通过Component API。
【解决方案3】:

关于这个论坛的经验

(两个回答者+1)但是,我认为不可能正确回答您的问题,部分方法Graphics(2D) 需要以编程方式调用repaint(),其余方法直接实现此方法(在API 中) (确定其中一些在 API 中缺少此方法)

对于Swing JComponents 的一部分可能最好不同意,这个论坛充满了关于Concurency in Swing 的问题,从Graphics(2D) 开始,想到JTextComponentsJTree,并结束(同样的方式被声明为线程安全)与setText()

关于Concurency in Swing有很多问题

【讨论】:

  • 诶…………?问题的答案显然是肯定的 - 无需通过可能行为不端的 不相关 代码 来搅浑水
  • 我赞同 mKorbel 的健康怀疑:1) API 可以 change,虽然可能不是 repaint()。 2) 虽然repaint() 本身是线程安全的,但通常在更新组件后调用它,这不是线程安全的。
  • @trahgod 感谢翻译 :-) 虽然我有点不同意:a) 没有变化,但修复了文档错误(可以说是同一件事,说来话长) b) 如果是这样,调用重绘的代码之前是错误的,而不是重绘本身
  • “关于这个论坛的体验”是给Meta Stack Overflow的东西,不是为了回答。
猜你喜欢
  • 1970-01-01
  • 2014-03-31
  • 2015-07-22
  • 2014-11-15
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多