代码之家  ›  专栏  ›  技术社区  ›  Uri

Swing如何处理同一组件的连续更改?

  •  1
  • Uri  · 技术社区  · 15 年前

    我有点迷茫的摇摆画模型。

    假设我有一个jcomponent comp,我做了如下的事情:

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

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

    Swing如何处理这个问题?

    第一个调用是否触发立即重新绘制,以便在黄色之前有短暂的红色闪烁?这一顺序是否明显慢于仅仅涂一层黄色?

    如果我是从Swing事件线程之外运行此函数,我会假设在大多数情况下(尽管可能存在竞争条件),当Swing EDT访问该属性时,该属性已设置为黄色,因此不会有任何红色绘制。

    然而,我的理解是,我应该从Swing EDT中的一个可运行的内部进行这些调用。对吗?在这种情况下,似乎EDT必须完全执行每个更改而不需要任何“先行”?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Tom Hawtin - tackline    15 年前

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

    Swing组件上的方法应在EDT上调用。事件调度线程属于awt,而不是swing。

        2
  •  2
  •   Eugene Ryzhikov    15 年前

    首先,你不应该在EDT之外打这样的电话。结果可能是不可预测的。 因为所有Swing组件都是双缓冲的,所以在执行此操作时不会看到闪烁。此外,如果可能的话,所有连续的重新喷漆请求都会加入到一个请求中。

    总的来说,只要在EDT上完成,在执行此操作时就不应该看到任何问题。