【问题标题】:Create VolatileImage always return null创建 VolatileImage 总是返回 null
【发布时间】:2011-06-15 03:36:23
【问题描述】:

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

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);
    }
}

如何返回非空 VolatileImage ??

【问题讨论】:

  • 为什么不改用java.awt.image.BufferedImage
  • 我有一个 BufferedImage 实现...我想在不同平台上对这两个实现进行基准测试。
  • 等等,你真的是在无头运行吗?如果是这样,那么您已经回答了自己的问题...
  • 嗯,我不知道那是什么意思,或者假设是什么意思?我怎样才能改变那种无头状态???
  • Here 是一种解释。但是……你是无头还是不确定?

标签: java image swing java-2d


【解决方案1】:

这会改变无头模式:

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

【讨论】:

  • True,默认为false。但是,如果组件不可显示,createVolatileImage 仍然可以返回 null(请参阅我的回答)。
  • 是的,正如你所说,我试图从构造函数中删除它,但这并没有改变任何东西。无论如何,我的基准测试表明使用 VolatileImage 没有任何区别。谢谢:)
【解决方案2】:

您没有包含堆栈跟踪,但是构造函数是否抛出了异常?如果是这样,这可能是因为组件还不能显示,所以createVolatileImage 可能会返回null。尝试从构造函数中删除 createImage 调用。

【讨论】:

  • 我第一次尝试访问图像时抛出异常,我会尝试你的建议。
【解决方案3】:

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

1) 当构造函数被调用时

2) 当图像字段为空时

3) 当图像字段不为空时

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

【讨论】:

猜你喜欢
  • 2021-01-18
  • 2014-03-04
  • 2016-11-02
  • 2014-05-06
  • 2012-06-05
  • 2014-05-30
  • 2014-02-23
  • 2017-10-12
  • 2013-08-16
相关资源
最近更新 更多