Java等待repaint()方法完成 - 不知道如何实现

时间:2013-12-26 19:17:41

标签: java swing repaint

我搜索了很多问题 wait until repaint has finished ,但我从来没有找到能够真正实现或理解的答案!
我不希望代码在重新绘制屏幕时继续!
我有一个简单的功能:

public static void clearScreen()
{
    panel.repaint();    
}

我现在可以告诉你这个有效! 唯一的问题是它不等待重新绘制,例如:

public static void blah()
{
    drawSomething();
    clearScreen();
    drawSomething();
}

两张图很有可能从屏幕上清晰显示。你可能猜到我不想要这个!
我只想提一下所有单独的功能

2 个答案:

答案 0 :(得分:3)

请求对组件进行重新绘制会将重绘事件添加到Event Dispatch Thread,这是一个单独的后台线程,实际上稍后会调用paint()

取决于您在drawSomething()中执行的操作可能在事件发送线程重新绘制之前或之后发生。最好的办法是通过在SwingUtilities.invokeLater的调用中“绘制内容”来完成事件调度线程的所有工作。这将在事件派发线程上运行您的代码。事件调度线程上的所有进程都按它们提交的顺序执行(通常,一些重绘请求被组合等),因此保留了调用的逻辑顺序。

详细了解事件调度线程in the Oracle Java Tutorial

答案 1 :(得分:0)

Swing使用被动绘画系统,也就是说,屏幕不会在常规基础上更新,而是根据需要进行绘制(或者更准确地说,就像RepaintManager认为的那样)。

您可以通过调用重绘来发出更新UI的请求,但是由RepaintManager来决定应该发生什么以及何时发生。 RepaintManager将在事件队列上放置一个重绘事件,该事件将在未来的某个时间由事件调度线程处理。

这基本上意味着什么,通常不可能知道什么时候可能出现油漆(因为绘画可能由于种种原因而发生)。

请查看Painting in AWT and Swing了解详情

你可以......

雇佣您自己的缓冲区,您可以随时在其上绘制,但是是独立绘制到屏幕上的。您可以使用BufferedImage。这个问题是你将不得不监视容器的变化,以确保缓冲区大小合适

你可以......

实现自己的队列,然后添加“命令”,然后由paint方法

处理

这样做的问题是确保在处理队列之前锁定或复制队列