【发布时间】:2015-10-21 16:11:23
【问题描述】:
我在课堂collection 中有一个循环,其中repaint() JPanel 不断
while(loop) {
imageicon = (ImageIcon) ois.readObject();
image = imageicon.getImage();
cjpanel.tempimage = image;
cjpanel.repaint();
Thread.sleep(100);
}
和cjpanel 扩展了JPanel,我已经覆盖了paintComponent() 并且我正在使用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 总是在 while 循环后面两帧。即如果image 4 在while 循环中,那么paintComponent() 正在绘制`图像2。
那么在之前的repaint 完成之前,我怎样才能加速repaint 或停止新的repaint?
更新
当我从 ObjectInputStream 更改图像的大小时,它工作正常。我认为这与图像大小有关..
【问题讨论】:
-
您的
while循环位于何处?使用image的代码在哪里?此外,您正在调用tempimage.getScaledInstance,但您忽略了返回的缩放图像。此外,在我看来,保持相同的bufferGraphics对象“打开”在理论上应该可行,但它的代码味道很差。最后,JPanel 自己做双缓冲,所以你可能应该将你的图像传递给一个drawImage方法,该方法接受四个 int 参数,而不是自己缩放它。 -
@VGR 请查看我更新的问题。我正在使用
cjpanel显示图像 -
"我正在使用双缓冲" Swing 已经是双缓冲了,你不需要做任何事情。
-
@user1803551 是的 Swing 已经是双缓冲了..
标签: java swing paintcomponent repaint