【问题标题】:Update a BufferedImage in a JFrame更新 JFrame 中的 BufferedImage
【发布时间】:2011-10-26 22:22:26
【问题描述】:

我通过自己的类在 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 调用更新方法以响应对重绘的调用”。我不确定我的组件是否是轻量级的。

在任何情况下,我的 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 的最大值仍然没有效果。顺便说一句,我的测试图像只是一张白纸,因此红色像素应该在其中突出。

我做错了什么?

【问题讨论】:

  • 嗯。看来我的问题不是 AWT/Swing 而是 setRGB。循环之后,我在 Vector 中获取第一个随机像素,然后检查它的 getRGB 是否等于 Color.red.getRGB()(使用 System.out.println)。它打印真实。但是,我写出 BufferedImage(使用 ImageIO.write)发现 nothing 实际上发生了变化。那么……我使用 setRGB 有什么问题吗?
  • 附录: SSCCE 按照@camickr 的建议出现。但是,如果有人可以在没有我的 SSCCE 的情况下提出任何建议,那就太好了。谢谢!

标签: java awt jframe bufferedimage repaint


【解决方案1】:

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

不,您不应该覆盖 update()。你可以用 AWT 做这件事,但用 Swing 做不到。

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

如果您需要更多帮助,而不是发布您的 SSCCE 来证明问题。

【讨论】:

  • 问题已关闭。我复制粘贴了我的代码的相关点点滴滴来制作示例。然后我尝试在网上发布之前对其进行一些错误搜索。但是,唉,我忘了取消覆盖 update()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多