在EDT之外安全使用Component.repaint()?

时间:2012-03-20 12:11:51

标签: java swing awt

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

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

3 个答案:

答案 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有大量问题