我搜索了很多问题 wait until repaint has finished
,但我从来没有找到能够真正实现或理解的答案!
我不希望代码在重新绘制屏幕时继续!
我有一个简单的功能:
public static void clearScreen()
{
panel.repaint();
}
我现在可以告诉你这个有效! 唯一的问题是它不等待重新绘制,例如:
public static void blah()
{
drawSomething();
clearScreen();
drawSomething();
}
两张图很有可能从屏幕上清晰显示。你可能猜到我不想要这个!
我只想提一下所有单独的功能!
答案 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方法
处理这样做的问题是确保在处理队列之前锁定或复制队列