Java paintComponent告诉是否再次调用

时间:2016-09-16 14:31:42

标签: java swing paintcomponent

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

2 个答案:

答案 0 :(得分:4)

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

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

buffered image

此相关example以类似方式构建TexturePaint

textured image

要获得具体指导,请修改您的问题以包含显示修订方法的Minimal, Complete, and Verifiable example

答案 1 :(得分:0)

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

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

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

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