2009-09-18 26 views
1

我对Swing绘画模型有点困惑。Swing如何处理对同一组件的连续更改?

假设我有一个JComponent补偿,我做这样的事情:

c.setBackground(Color.RED); 
c.setBackground(Color.YELLOW); 

显然,最终的结果是,颜色为黄色。

Swing如何处理这个问题?

第一次调用是否触发立即重新绘制,所以在黄色之前会有短暂的红色闪烁?这个序列是否比黄色涂料慢得多?

如果我是从Swing Event线程之外运行的,我会假设在大多数情况下(尽管竞争条件是可能的),到Swing EDT访问时,属性已经设置为黄色,永远不会有任何红色的画。

但是,我的理解是,我应该从Swing EDT中的Runnable内部进行这些调用。那是对的吗?在这种情况下,美国东部时间看起来似乎必须在没有任何“预测”的情况下全面执行每项变更?

回答

4

窗口区域立即被标记为脏。稍后将在美国东部时间公布油漆要求。操作系统或事件队列机制(甚至是组件)可以合并重绘事件(严格来说是实现质量的事情,但实际上在同一窗口中的重绘将被合并,即使它们不相交)。

摆动组件上的方法应在EDT上调用。事件派发线程属于AWT,而不是Swing。

+0

汤姆,我有点困惑。如果我在invokeLater()或invokeAndWait()中运行这两个命令,它们中的每一个都不会立即出现?或者Swing在EDT上添加额外的invokeLaters()以及它自己的指令?另外,EDT和AWT调度线程是一样的吗? – Uri 2009-09-18 14:59:53

+0

如果您在invokeLater内部运行,则整个代码块(在Runnable中)将在EDT上执行。查看我的回复 – 2009-09-18 15:02:50

+0

如果使用'invokeLater' /'invokeAndWait',则该命令将排队并在与涂料相同的线程上执行。 'invokeLater' /'invokeAndWait'只需在AWT'EventQueue'上添加一个'InvocationEvent'即可。 – 2009-09-18 15:05:20

2

首先,你不应该在美国东部时间之外打这样的电话。结果可能是不可预测的。 由于所有Swing组件都是双缓冲的,因此在执行此操作时您将看不到闪烁。除此之外,所有连续的重绘请求都会在可能的情况下合并成一个。

总体而言,只要它在EDT上完成,您应该完全不会看到任何问题