Java 更新JFrame中的BuffereImage

Java 更新JFrame中的BuffereImage,java,awt,jframe,bufferedimage,repaint,Java,Awt,Jframe,Bufferedimage,Repaint,我通过自己的类在JFrame中显示了一个BuffereImage。我选择使用我自己的类来显示BuffereImage,以便可以缩放它。我的组件和更新 public class MyBuffIm{ public void paintComponent(Graphics canvas) { if (bi == null) { } else { //bi, maxWidth, and maxHeight were passed to constructor

我通过自己的类在JFrame中显示了一个BuffereImage。我选择使用我自己的类来显示BuffereImage,以便可以缩放它。我的组件和更新

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());
    }
}
}
我覆盖了update,因为文档说“如果这个组件不是轻量级组件,AWT调用update方法来响应repaint调用”。我不确定我的组件是否轻量级

在任何情况下,我的Runnable中都有以下代码(没有预期的效果):

BufferedImage p=SomeMyBuffIm.getBuffIm();
矢量随机像素=getRandomPixels(500);
int limit=randomPixels.size()
对于(i=0;i
我想,既然我在缩放我的图像,我就无法分辨新图像和旧图像之间的区别。但我尝试了getRandomPixels的最大值,但仍然没有效果。顺便说一句,我的测试图像只是一张白纸,所以红色的像素应该会在其中突出

我做错什么了吗

我覆盖了update,因为文档说“如果这个组件不是轻量级组件,AWT调用update方法来响应repaint调用”。我不确定我的组件是否轻量级

不,您不应该覆盖update()。你可以用AWT,但不能用Swing

如果更新BuffereImage,则只需在MyBuffin类的实例上调用repaint()


如果您需要更多的帮助,而不是张贴说明问题的帖子。

Meh。我的问题似乎不是AWT/Swing,而是setRGB。循环之后,我获取向量中的第一个随机像素,然后检查其getRGB是否等于Color.red.getRGB()(使用System.out.println)。这是真的。然而,我写出了BuffereImage(使用ImageIO.write)来发现实际上没有任何变化。那么…我使用setRGB有什么问题吗?附录:SSCCE正如@camickr建议的那样。但如果有人能在没有我的SSCCE的情况下提出任何建议,那就太好了。谢谢本期结束。我复制粘贴了代码的相关部分来制作示例。然后我试着在网上发布之前对它进行一些错误搜索。但是,唉,我忘了取消覆盖update()。
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