2011-01-25 2 views
2

Я создаю изменчивое изображение в следующем классе, но каждый раз ударяю NullPointerException. Причина, по которой createVolatileImage() возвращает значение null (из его JavaDoc), заключается в том, что GraphicsEnvironment.isHeadless() истинно.Создать VolatileImage всегда возвращает null

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 ??

+0

Почему бы не использовать 'java.awt.image.BufferedImage' вместо этого? – trashgod

+0

Ну, у меня есть реализация BufferedImage ... Я хочу сравнить эти две реализации на разных платформах. – FearUs

+0

Держитесь, вы на самом деле бежите без головы? Если да, то вы уже ответили на свой вопрос ... – kschneid

ответ

1

Это изменит обезглавленный режим:

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

Истина, и по умолчанию она должна быть ложной. Тем не менее, 'createVolatileImage' может по-прежнему возвращать значение null, если компонент не отображается (см. Мой ответ). – kschneid

+0

yes Я попытался удалить его из конструктора, как вы сказали, но это ничего не изменило. В любом случае мой тест показал, что использование VolatileImage не имеет никакого значения. Благодаря :) – FearUs

0

Вы вызываете тот же метод createImage() в трех разных предварительных условиях.

1) Когда конструктор вызывается

2) Когда поле изображения равно нулю

3) Когда поле изображения не является нулевым

Ваша проблема может заключаться в осуществлении createImage().

+0

ну нет, я следую этой реализации: http://weblogs.java.net/blog/chet/archive/2003/09/volatileimage_n.html – FearUs

0

У вас не было stacktrace, но есть ли исключение из конструктора? Если это так, это, вероятно, происходит потому, что компонент пока не отображается, поэтому createVolatileImage может вернуться null. Попробуйте удалить вызов createImage от конструктора.

+0

Исключение возникает, когда я сначала пытаюсь получить доступ к изображению, я попробую ваше предложение. – FearUs

Смежные вопросы