在EDT之外安全使用Component.repaint()?
我找不到任何官方文档说从除了事件调度线程(EDT)之外的另一个线程调用Component.repaint
是安全的。
这样吗? 我在哪里可以找到一些文档/代码?
以下是官方页面的引用 :
从任何线程调用以下JComponent方法都是安全的:
repaint()
,revalidate()
和invalidate()
。repaint()
和revalidate()
方法将事件派发线程的请求分别调用paint()
和validate()
。
编辑1:
由于前面提到的链接已经转移。 我发布了一个新的链接 ,虽然可能需要更多的时间来真正了解这个页面的真实性,因为它似乎来自Java
虽然它来自一些University
的服务器,从地址栏可以看出。
它是线程安全的。 RepaintManager
确保将此类调用放在事件调度线程中。
在AWT和Swing中绘画(“官方”文档)
Swing的
RepaintManager
类的目的是最大化Swing包含层次结构上重绘处理的效率,并实现Swing的“重新validation”机制(后者将成为单独文章的主题)。 它通过拦截Swing组件上的所有重绘请求(因此它们不再由AWT处理)并在需要更新的内容上维护自己的状态(称为“脏区”)来实现重绘机制。 最后,它使用invokeLater()
来处理事件调度线程上的挂起请求,如“重新绘制处理”一节(选项B)中所述。对于大多数程序,RepaintManager可以被视为Swing内部系统的一部分,几乎可以忽略。 但是,它的API为程序提供了更好地控制绘画某些方面的选项。
关于这个论坛的经验
(对于两个回答者来说都是+1)但是,我认为不可能正确回答你的问题,方法的一部分Graphics(2D)
需要以编程方式调用repaint()
,其余的直接实现此方法(在API
)(确保一些他们在API中遗漏了这个方法)
对于Swing JComponents
一部分可能更好的不同意,这个论坛充满了关于Concurency in Swing
的问题,从Graphics(2D)
思考JTextComponents
, JTree
,并以setText()
结束(同样的方式声明为线程安全setText()
,
关于Concurency in Swing
有很多问题