创建VolatileImage始终返回null

时间:2011-01-25 11:39:48

标签: java image swing java-2d

我在下面的类中创建了一个volatile图像,但每次都会遇到NullPointerException。 createVolatileImage()返回null(来自其JavaDoc)的原因是GraphicsEnvironment.isHeadless()为true。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.VolatileImage;
import javax.swing.JPanel;

public class Tube extends JPanel {

    private VolatileImage image;
    private int width, height;

    public Tube() {
        super(true);
    }

    public Tube(int width, int height) {
        this.width = width;
        this.height = height;
        createImage();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(image == null)
            createImage();
        if(image.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE)
            createImage();
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        g2.drawImage(image, 0, 0, this);
    }

    public VolatileImage getBufferedImage() {
        return this.image;
    }

    private void createImage(){
        if(image != null){
            image.flush();
            image = null;
        }
        image = createVolatileImage(width, height);
        image.setAccelerationPriority(1.0f);
    }
}

如何返回非null的VolatileImage?

3 个答案:

答案 0 :(得分:1)

这会改变无头模式:

System.setProperty("java.awt.headless", "false");

答案 1 :(得分:0)

您在三种不同的前提条件中调用相同的方法createImage()。

1)调用构造函数时

2)当图像字段为空时

3)当图像字段不为空时

您的问题可能在于createImage()方法的实现。

答案 2 :(得分:0)

您没有包含堆栈跟踪,但是从构造函数抛出异常?如果是这样,可能会发生这种情况,因为该组件尚未显示,因此createVolatileImage可能会返回null。尝试从构造函数中删除createImage调用。