Java paintComponent告诉是否再次调用

谷歌搜索了几天,我无法弄清楚如何在我处理paintComponent时调用paintComponent。 这个过程漫长而复杂。 如果我有第二个(或第三个)绘画请求,我想中止当前的绘制过程并重新开始最近的请求。

你不能; 对paintComponent()调用排队,阻止EDT直到完成。 使用此AnimationTest显示的方法在典型的目标平台上自行实现您的实现。 根据需要进行优化。 作为一个具体的例子,这个KineticModel演示了几种可能适用于您的用例的动画技术。

附录:您的更新表明“漫长而复杂”的过程涉及构建BufferedImage以供以后显示。 为避免阻止EDT,请在SwingWorker的后台执行此操作,您可以从中publish()临时结果。 此示例模拟一次一行构建光栅图像。

缓冲图像

该相关示例以类似的方式构造TexturePaint

纹理图像

有关具体指导,请编辑您的问题以包含显示修订方法的最小,完整和可validation示例 。

像往常一样,我想到一个解决方案后…我的解决方案是启动一个逐步更新BufferedImage的线程。 然后,paintComponent方法只有两行:

 protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(myImage, 0, 0, null); } 

图像绘制得非常快。 在重绘图像之前,需要调用super来擦除图像的现有视图。

解决方案的其余部分是创建一个更新面板的myImage属性的线程。 在我的工作中,图像需要大约30分钟才能完全处理,具体取决于程序的输入。 除非我在应用程序运行时拖动窗口或意外触摸鼠标滚轮,否则这不是什么大问题。 然后,再次调用paintComponent并挂起程序。 使用此解决方案,更新可能需要数天,您可以根据需要调整窗口大小或移动窗口。 到目前为止,您一直在查看图像。