3

写真を含む JPanel を追加しようとしています。パスを取得するために ImageIO.read を使用していますが、入力ファイルを読み取れないという IOException が表示されます

写真は TCHLogo と呼ばれます。私のプロジェクト内の「res」フォルダー内のPNGです。

この画像を表示するためのより良い方法があれば、それも言及してください!

JPanelのコードは次のとおりです。

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
        try {                
           //THIS LINE BELLOW WAS ADDED
           image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));
        } catch (IOException ex) {
             // handle exception...
            System.out.println(ex);
        }
     }

     @Override
     public void paintComponent(Graphics g) {
         super.paintComponent(g);  //THIS LINE WAS ADDED
         g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters
     }

}

アプレットに JPanel を追加する方法は次のとおりです。

ImagePanel appletRunningPanel;
appletRunningPanel = new ImagePanel();
appletRunningPanel.setSize(300, 300);
appletRunningPanel.validate();
add(appletRunningPanel);

編集アプリケーションが現在検索を開始するビン内にフォルダーを作成しました..フォルダーはresと呼ばれ、画像は内部にあります..

行を実行すると、次の IOException が発生します。

image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

エラーログは次のとおりです。

java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(ImageIO.java:1338)
    at surprice.applet.ImagePanel.<init>(ImagePanel.java:17)
    at surprice.applet.MainClass.init(MainClass.java:41)
    at sun.applet.AppletPanel.run(AppletPanel.java:436)
    at java.lang.Thread.run(Thread.java:679)
4

2 に答える 2

4

画像のファイルパスがユーザーディレクトリに対して正しくない可能性があります。Javaがどこを探し始めているか、ユーザーディレクトリがどこにあるかを確認するには、プログラムのどこかに次のようなコード行を配置します。

System.out.println(System.getProperty("user.dir"));

おそらく、ファイルとしてではなく、リソースから取得したInputStreamとして画像を取得する方がよいでしょう。例えば、

image = ImageIO.read(getClass().getResourceAsStream("res/TCHLogo.png"));

これにより、クラスファイルの場所を基準にして指定されたパスで画像が検索されます。実際、画像がjarファイルにある場合は、これを実行する必要があります。

編集2
余談ですが、多くの場合、「ダーティ」な画像ビットを取り除くなど、必要なハウスキーピングを実行できるように、独自の描画を行う前に、まずスーパーのpaintComponentメソッドを呼び出す必要があります。たとえば、これを変更します。

 public void paintComponent(Graphics g) {
     g.drawImage(image, 0, 0, null); 
 }

これに:

 public void paintComponent(Graphics g) {
     super.paintComponent(g); // **** added****
     g.drawImage(image, 0, 0, null); 
 }
于 2011-11-13T20:27:58.007 に答える
2

このスコープに使用するこの ImagePanel クラスを作成しました。

public class ImagePanel extends JPanel {

    private static final long serialVersionUID = 7952119619331504986L;
    private BufferedImage image;

    public ImagePanel() { }

    public ImagePanel(String resName) throws IOException {
        loadFromResource(resName);
    }

    public ImagePanel(BufferedImage image) {
        this.image = image;
     }

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters

    }

    public BufferedImage getImage() {
        return image;
    }

    public void setImage(BufferedImage image) {
        this.image = image;
    }

    /**
     * Load the Image from a File
     * @param path image name and path
     * @throws IOException
     */
    public void loadFromFile(String path) throws IOException {
        image = ImageIO.read(new java.io.File(path));
    }

    /**
     * Load Image from resource item
     * @param resName name of the resource (e.g. : image.png)
     * @throws IOException
     */
    public void loadFromResource(String resName) throws IOException { 
        URL url = this.getClass().getResource(resName);
        BufferedImage img = ImageIO.read(url);

        image = img;
    }
}

次に、この方法で ImagePanel を使用します。

 //Inizialization of the ImagePanel
 ImagePanel panelImage = new ImagePanel();
//Try loading image into the image panel
        try {
            panelImage.loadFromResource("/Resources/someimage.png");
        } catch (java.io.IOException e) {
                //Handling Exception
        }
于 2011-11-13T20:41:40.190 に答える