2013-05-27 45 views
2

我想使用2個圖像(從文件加載後)創建FinalImage並顯示它。所以我創建了類:PaintComponent中的BufferedImage始終爲空

public class ImagePanel extends JPanel{ 

private static final long serialVersionUID = 1L; 
private BufferedImage firstImage; 
private BufferedImage secondImage; 
private BufferedImage finalImage; 

public ImagePanel(BufferedImage first, BufferedImage second){ 
    if(first != null && second != null){ 
     this.firstImage = deepCopy(first); 
     this.secondImage = deepCopy(second); 
     finalImage = new BufferedImage(firstImage.getWidth()*2, firstImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics g = finalImage.getGraphics(); 
     g.drawImage(firstImage, 0, 0, null); 
     g.drawImage(secondImage, firstImage.getWidth(), 0, null); 
     System.out.println("FinalImage"+finalImage.toString()); 
    } 
} 

private BufferedImage deepCopy(BufferedImage bi) { 
    ColorModel cm = bi.getColorModel(); 
    boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); 
    WritableRaster raster = bi.copyData(null); 
    return new BufferedImage(cm, raster, isAlphaPremultiplied, null); 
} 

protected void paintComponent(Graphics g) { 
    super.paintComponents(g); 
    if(finalImage != null){ 
     g.drawImage(finalImage, 20, 20, null); 
    } 
} 
} 

但是,當我重繪()這個類時,我總是從finalImage中獲得null。 我用deepCopy,但這種方法不會改變任何東西。 我也檢查了什麼toString方法給予,一切都是okej(它給我finalImage正常的寬度和高度)

有人知道爲什麼null總是給paintComponent方法?

感謝您的幫助:)

+0

我想知道你的問題是否出現在代碼中。也許你正在使用兩個ImagePanel對象。 –

+0

也不要調用super的paintComponents方法,而是調用其paintComponent方法。 –

+0

我有1個私人ImagePanel imagePanel;在MainFrame和構造函數中,我給imagePanel = new ImagePanel(null,null)和next(startButton clicked)imagePanel = new ImagePanel(img1,img2)。我相信img1和img2它不是null。 – Sawior91

回答

3

您的評論顯示您的問題。您有兩個ImagPanel對象,其中一個顯示並且具有空圖像,另一個不顯示並具有非空圖像。

解決方案:只創建一個對象。給它一個setImages(Image img1, Image img2)方法,並在需要設置圖像時調用它。

也根據我的評論改變你的超級方法調用。