我找不到任何官方文档说从除了事件调度线程(EDT)之外的其他线程调用Component.repaint
是安全的。
答案 0 :(得分:27)
以下是quote from an official page说明:
以下JComponent方法可以安全地从任何线程调用:
repaint()
,revalidate()
, 和invalidate()
。repaint()
和revalidate()
方法对请求进行排队 事件派发线程分别调用paint()
和validate()
。
编辑1:
由于前面提到的链接已经转移。我发布了new link,虽然可能需要更多时间才能真正了解此页面的真实性,因为它似乎来自Java
,尽管它来自某些University
的服务器,从地址栏可以看出。
答案 1 :(得分:7)
它是线程安全的。 RepaintManager
确保将此类调用放在事件调度线程中。
Painting in AWT and Swing ("official" documentation)
Swing
RepaintManager
课程的目的是最大化。{ Swing包含层次结构上重绘处理的效率,和 还要实现Swing的“重新验证”机制(后者将是 单独文章的主题)。它实现了重绘机制 通过拦截Swing组件上的所有重绘请求(所以它们是 不再由AWT处理)并保持自己的状态 需要更新(称为“脏区”)。最后,它使用invokeLater()
处理事件的待处理请求 调度线程,如“重绘”部分所述 处理“(选项B)。对于大多数程序,可以将RepaintManager视为Swing的一部分 内部系统实际上可以忽略。但是,它的API 为程序提供了对某些程序进行更好控制的选项 绘画方面。
答案 2 :(得分:3)
关于此论坛的经验
(对于两个回答者都是+ 1)但是,我认为无法正确回答您的问题,方法Graphics(2D)
的一部分需要以编程方式调用repaint()
,其余的方法实现此方法(在{ {1}})直接(确定其中一些人在API中缺少此方法)
部分API
或许最好不同意,此论坛充满了关于Swing JComponents
的问题,从Concurency in Swing
思考Graphics(2D)
开始,{{1}使用JTextComponents
,
关于JTree
有大量问题