将Jpanel写入缓冲图像堆栈溢出

时间:2015-05-20 18:14:21

标签: java swing bufferedimage

我正在尝试将JPanel图片写入BufferedImage(稍后转换为渲染图像)。我出于某种原因在AWT-EventQueue-0线程中出现堆栈溢出错误,并且不确定是否有我忽略的原因。

有问题的代码:

public BufferedImage createImage() {
    int w = getWidth();
    int h = getHeight();
    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    cp.paint(bi.getGraphics());

    //debug script
    File outputfile = new File("image"+index+".jpg");
    try {
        ImageIO.write(bi, "jpg", outputfile);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    index++;


    return bi;
}

JPanel paintComponent

@Override
protected void paintComponent(Graphics g) {

    super.paintComponent(g);
    r = new Random(System.nanoTime());
    int maxSize = 100;
    int randX = r.nextInt(getWidth());
    int randY = r.nextInt(getHeight());
    int randWidth = r.nextInt(maxSize);
    int randHeight = r.nextInt(maxSize);
    Color color = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
    Graphics2D g2d = (Graphics2D) g;

    ovals.add(new MyCircles(randX, randY, randWidth, randHeight, color));   
    for (MyCircles c : ovals) {
            c.paint(g2d);
    }
    g2d.setColor(getForeground());


    repaint();

    double current = ImageComparator.calcDistance((RenderedImage)createImage());

    //debugging script
    System.out.println("Current: " + current);
    System.out.println("Previous" + previous);


    if(current > previous) {
        ovals.remove(ovals.size()-1);
    }
    else {
        previous = current;
    }


}

非常感谢任何有关如何修改此问题的见解!

3 个答案:

答案 0 :(得分:4)

移除repaint中对paintComponent的调用,导致该方法被无线调用无限

答案 1 :(得分:2)

与您的问题没有直接关系但是,您绝不应该在绘画方法中使用Random类。每次调用方法时,绘画都会更改,因此您创建和保存的图像将与面板上的图像不同。

此外,您不应该在paint方法中添加椭圆,原因与上述相同。

您需要创建一个addOval(...)方法,该方法将设置椭圆的随机颜色并将椭圆添加到List中。绘图代码将遍历List并绘制Oval。

您也不应该在绘画代码中删除椭圆。绘画代码仅用于绘画,而不是操纵绘制的对象。

您还可以尝试Screen Image类,它基本上是图像创建代码的更灵活版本。

答案 2 :(得分:0)

当然,你有无限循环:

以下是您调用方法的方式:

createImage()
 |__paint()
    |__createImage() // again in ImageComparator.calcDistance line
       |__paint()
           |__createImage() // again in ImageComparator.calcDistance line
              |__paint()
                 |__createImage() // again in ImageComparator.calcDistance line
                   |__paint()
                        TOY STORY 1 (Buzz) : to the infinite and beyond it :)

你永远不会停止这个循环。

我建议您需要获取图像,然后比较它们的油漆。让绘画只绘制图像并在其外部进行比较。