2017-03-14 9 views
0

JLabelに画像を表示する際に問題があります。私は、プロジェクトフォルダに画像を保存するControlPanelという別のクラスを持っています。このクラスの画像を保存するメソッドがありましたが、何らかの理由でNullPointerExceptionが発生しました。私が他のクラスでそれらを動かすと、すべてが正しく動作するようになりました。実際のイメージは、ユーザーが描画するbufferedImageです。JLabelに画像を表示する

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class GalleryPanel extends JPanel 
{ 

    private static final long serialVersionUID = 1L; 
    private JLabel[] images; 
    private static final int MAX_IMAGES = 12; 
    private int currentImage; 


    public void init() 
    { 
     images = new JLabel[MAX_IMAGES]; 
     setLayout(new GridLayout(3,4)); 
     setBackground(Color.GRAY); 
    } 


    public void addImageToGallery(String fileName, String fileExtension) 
    { 
     if (currentImage < images.length - 1) 
     { 
      ImageIcon icon = new ImageIcon(fileName + fileExtension); 

      images[currentImage] = new JLabel(icon, JLabel.CENTER); 

      add(images[currentImage]); 

      displayImage(currentImage); 

      currentImage++; 
     } 
     else 
     { 
      throw new ArrayIndexOutOfBoundsException("The gallery is full"); 
     } 
    } 


    // display the doily image in the gallery 
    public void displayImage(int index) 
    { 
     images[index].setSize(300, 300); 
     add(images[index]); 
    } 


    public final int getMaxImages() 
    { 
     return MAX_IMAGES; 
    } 


    public Dimension getPreferredSize() 
    { 
      return new Dimension(380, 700); 
    } 

} 

たものは、私はあなたがこのようなあなたのギャラリーを宣言すると思う実際の画像

// Shows a dialog box which asks the user to choose a name for the file that he wants to save 
public void saveImage(BufferedImage bufImage) 
{ 
    String fileName = JOptionPane.showInputDialog("Choose image name"); 

    if (fileName != null) 
    { 
     if(fileName.equals("")) 
     { 
      fileName = "Untitled"; 
     } 

     chooseImageFormat(bufImage, fileName); 
    } 

} 


    //shows a dialog box which asks the user to select the file format of the image he would like to save 
public void chooseImageFormat(BufferedImage bufImage, String fileName) 
{ 
    Object[] imageFormats = {"PNG", "JPEG"}; 

    String userInput = (String) JOptionPane.showInputDialog(null, "Choose file format", "File Format Settings", JOptionPane.PLAIN_MESSAGE, null, imageFormats, "PNG"); 


    String imageFormat = (userInput.equals("PNG")) ? "PNG" : "JPEG"; 
    String fileExtension = (imageFormat.equals("PNG")) ? ".png" : ".jpg"; 

    File file = new File(fileName + fileExtension); 

    try 
    { 
     ImageIO.write(bufImage, imageFormat, file); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    gallery.addImageToGallery(fileName, fileExtension); 
} 
+0

ここでNullPointExceptionがスローされますか?あなたはあなたのエラーをしてください? –

+0

現実のイメージが保存され、gallery.addImageToGallery(fileName、fileExtension)にnullポインタがあります。 –

+0

BTW:これは "if(currentImage "を使用してください –

答えて

0

を保存するための責任がある私の他のクラスの2つの方法です。そのために

GalleryPanel gallery; 

あなたはNullPointerExceptionを取得する代わりに、次のようにしてください。

GalleryPanel gallery = new GalleryPanel(); 

EDIT

それは働いたが、このようなギャラリーをインスタンス化しないようにする方法はありますか?

public static void addImageToGallery(String fileName, String fileExtension) { 

あなたはAを呼び出すことができます:あなたはそれを宣言し、それを使用する前に、それを初期化するために、別の解決策があるはずですが、あなたのコードに多くの変更を行うために、あなたが作るために持っている必要があり

このような静的メソッド

GalleryPanel.addImageToGallery(fileName, fileExtension); 

しかし、私が言ったように、あなたは多くの変更を加えるべきです。

幸運。

+0

これは働いたが、このようなギャラリーをインスタンス化しない方法はありますか? –

+0

mmm、私は@RadoslavTodorovはあなたがそれを宣言し、それを使用する前に初期化する必要があるとは思わない、別の解決策がありますが、あなたのコードに多くの変更を加える必要があります。 'addImageToGallery'静的メソッドを作る必要がありますこの 'GalleryPanel.addImageToGallery(fileName、fileExtension); 'のように呼びますが、私が言ったように、多くの変更を加える必要があります –

+0

なぜ受け入れられた回答のための下降投票? –