我在类collection中连续有一个repaint() JPanel这个循环

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


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

@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总是在while循环后面落后两帧。即如果image 4while循环中,则paintComponent()在绘制`image 2。

那么,如何在上一个repaint完成之前加速repaint或停止新的repaint

更新

当我从ObjectInputStream更改图像的大小时,它工作正常。我认为它必须与图像大小有关。

最佳答案

您不应该在while循环中重新读取图像。一次读取图像并将其存储在变量中,可能是诸如ArrayList之类的集合。
根据您的使用方式将它们存储为图像或图标。将图像存储为图像时,无需在Icon上调用getImage()。
不要使用while循环,而应该使用Swing定时器,以免违反Swing线程规则。
您实际上是在寻求调试帮助,“为什么此代码无法按预期工作?”帮助,因此,如果一般建议没有帮助,您确实必须强烈考虑创建并发布最短的代码,以使我们能够编译,运行并帮助确定您的问题,即minimal example program(请检查链接)。否则,除了像我上面所做的一般建议以外,我们将无法提供其他帮助。我同意我的要求不是一件容易或快速的事情,因为这需要您付出很多努力,但是如果您仍然坚持并需要解决方案,那将是值得的努力。由您决定,并且完全取决于您的需要。

10-07 19:10
查看更多