2011-01-25 51 views
2

我在下面的類中創建了一個volatile圖像,但每次都會觸發一個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 2011-01-25 11:45:13

+0

好吧,我有一個BufferedImage實現...我想在不同平臺上對這兩個實現進行基準測試。 – FearUs 2011-01-25 11:56:19

+0

等一下,你真的跑無頭了嗎?如果是這樣,那麼你已經回答了你自己的問題... – kschneid 2011-01-25 17:34:48

回答

1

這將改變無頭模式:

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

您在三種不同的前提條件下調用了createImage()方法。

1)當調用構造函數

2)當圖像字段爲空

3)當圖像字段不爲空

您的問題可能在於創建圖像的實施() 方法。

0

您沒有包含堆棧跟蹤,但是構造函數拋出的異常?如果是這樣,這可能是因爲組件尚未顯示,所以createVolatileImage可能會返回null。嘗試從構造函數中刪除createImage調用。