更新JFrame中的BufferedImage

时间:2011-08-14 20:20:07

标签: java awt jframe bufferedimage repaint

我有一个通过我自己的类在JFrame中显示的BufferedImage。我选择使用自己的类显示BufferedImage,以便我可以扩展它。我的paintComponent并更新

public class MyBuffIm{
public void paintComponent(Graphics canvas) {
    if (bi == null) {
    } else {
        //bi, maxWidth, and maxHeight were passed to constructor
        canvas.drawImage(bi, 0, 0, maxWidth, maxHeight, null);
    }
}

public void update(Graphics canvas) {
    super.update(canvas);
    if(bi != null){
        //Got this from some tutorial in the net.
        //Done out of desperation :|
        paintComponent(bi.getGraphics());
    }
}
}

我覆盖了更新,因为文档说的是“如果此组件不是轻量级组件,则AWT调用update方法以响应对重绘的调用”。我不确定我的组件是否轻量级。

在任何情况下,我的Runnable中都有以下代码(不能像我期望的那样工作):

BufferedImage p = SomeMyBuffIm.getBuffIm();
Vector<Point> randomPixels = getRandomPixels(500);
int limit = randomPixels.size()
for (i = 0; i < limit; i++) {
    Point rp = randomPixels.get(i)
    p.setRGB(rp.x, rp.y, Color.red.getRGB());
}
SomeMyBuffIm.repaint();
mainFrame.repaint(); //JFrame call to repaint

我想,由于我正在缩放图像,我无法辨别出新旧图像之间的区别。但我已经尝试了getRandomPixels的最大值仍然无效。顺便说一下,我的测试图像只是一张白纸,因此红色像素应该突出显示。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

  

我覆盖了更新,因为文档说的是“如果此组件不是轻量级组件,则AWT调用update方法以响应对重绘的调用”。我不确定我的组件是否轻量级。

不,你不应该覆盖update()。你会用AWT做到这一点,但不能用Swing做。

如果更新BufferedImage,那么您需要做的就是在MyBuffin类的实例上调用repaint()。

如果您需要更多帮助,请发布展示问题的SSCCE