如果之前的repaint()完成,则重绘()JPanel

时间:2015-10-21 16:11:23

标签: java swing paintcomponent repaint

我在collection课程中有这个循环repaint() JPanel持续

    while(loop) {
        imageicon = (ImageIcon) ois.readObject();
        image = imageicon.getImage();
        cjpanel.tempimage = image;
        cjpanel.repaint();
        Thread.sleep(100);
    }

cjpanel扩展了我已覆盖paintComponent()的JPanel,我正在使用Double buffering

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
tempimage.getScaledInstance(dim.width, dim.height, Image.SCALE_FAST);
bufferGraphics.clearRect(0,0,dim.width,dim.width);
bufferGraphics.drawImage(tempimage,0,0,dim.width,dim.height, null);
g.drawImage(offscreen,0,0,this);
}

我的问题是repaint在循环时总是落后两帧。即如果image 4位于while循环中,则paintComponent()正在绘制`图像2。

那么我怎样才能在repaint完成之前加快repaint或停止新的repaint

更新

当我从ObjectInputStream更改图像的大小时,它工作正常。我认为它必须对图像大小做些什么..

2 个答案:

答案 0 :(得分:2)

  1. 您不应该在while循环中重新读取图像。一次读取图像并将它们存储在变量中,可能是一个集合,例如ArrayList。
  2. 根据您的使用方式将它们存储为图像或图标。当您可以将图像存储为图像时,无需在图标上调用getImage()。
  3. 不要使用while循环而是使用Swing Timer,以免违反Swing线程规则。
  4. 你要求调试帮助,基本上,“为什么这段代码不按预期工作?”帮助,所以如果一般建议没有帮助,你真的必须强烈考虑创建和发布我们能够编译,运行和帮助识别你的问题所需的最短代码,minimal example program(请查看链接)。另外,正如我上面所做的那样,除了提供一般性建议外,我们无法提供更好的帮助。我同意我所要求的并不是一件容易或快速的事情,因为你需要付出相当大的努力,但是如果你仍然陷入困境并且需要一个解决方案,那么它将花费很多精力。由您决定,完全取决于您的需求。

答案 1 :(得分:2)

重绘管理器可以将顺序调用折叠到repaint,这样如果为每个图像绘制一帧,则某些图像可能不会显示。您可以使用paintImmediately强制重绘:

  

立即绘制此组件中指定区域及其与区域重叠的所有后代。

     

很少需要调用此方法。在大多数情况下,调用重绘效率更高,这会延迟实际绘制并将冗余请求折叠为单个绘制调用。如果在调度当前事件时需要更新显示,则此方法很有用。

至于

  

当我从ObjectInputStream改变图像的大小时,它工作正常。

它可能会影响重绘管理器计算如何/哪个重绘调用崩溃。

我建议您尝试使用此方法,看看它是否有效,但实现起来比较困难(仔细阅读API)。

感谢this post更新我的记忆。