JavaのSwingの画像表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

JavaのSwingの画像表示について

#1

投稿記事 by namachan10777 » 10年前

現在デスクトップマスコットを作っているのですが、パスを指定して画像を読み込めず困っています。
クラスファイルがあるディレクトリと同じディレクトリに画像を置けば正しく表示されるのですが、相対パスを指定して読み込むとうまく読み込めません。
下のコードのImageIcon icon = new ImageIcon(getClass().getResource("illust/sd06.png"));
というところをImageIcon icon = new ImageIcon(getClass().getResource("sd06.png"));
とすれば正しく表示されます
NullPointerExceptionは発生してないので画像自体は読み込めているのかと思い、画像の大きさを調べたところ異常に大きい値となっていました。
実際の大きさは165*400のところ、1154*2797と表示されていました。
ディレクトリ構成は以下のようになっています

コード:

Pronama
     Pronama.class
     sd06.png
    \illust
        sd06.png
            ・
             ・

コード:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Dimension;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


public class Pronama extends JFrame implements Runnable{
    private BufferedImage buffer;
    private Graphics2D buf;
    private Image pronama;

    private Pronama(){
        setSize(164, 400);
        setAlwaysOnTop(true);
        setDefaultCloseOperation(3);

        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();//画面の大きさを取得

        setLocation(screen.width - 164,screen.height - 400);//左下に配置

        //枠をなくす
        setUndecorated(true);
        //透明にする
        setBackground(new Color(0, 0, 0, 0));

        buffer=new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);//バッファイメージの作成
        buf = (Graphics2D)buffer.getGraphics();
        ImageIcon icon = new ImageIcon(getClass().getResource("illust/sd06.png"));//imageIconを利用してロード
        pronama = icon.getImage();//イメージ
        System.out.println(pronama.getWidth(this));
        System.out.println(pronama.getHeight(this));

        setVisible(true);

        new Thread(this).start();
    }

    public void paint(Graphics g){//ここで描画を行う
        //バッファーの準備
        buf.setBackground(new Color(0, 0, 0, 0));
        buf.clearRect(0, 0, getWidth(), getHeight());
        //バッファーに描画
        buf.drawImage(pronama,0,0,this);
        //フレームの描画準備
        ((Graphics2D)g).setBackground(new Color(0, 0, 0, 0));
        g.clearRect(0, 0, getWidth(), getHeight());
        //フレームに描画
        g.drawImage(buffer, 0, 0, this);
    }

    public static void main(String[] args) {
        new Pronama();
    }

    @Override
    public void run() {
        while(true){
            repaint();//再描画
            try {
                Thread.sleep(30l);//30ミリ病停止
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}
jdkは8u45を使用しており、IDEは使っていません。OSはLinux Mint Cinammonです
GitHubのリポジトリです
https://github.com/namachan10777/Pronama/
D言語!D言語!

ISLe()

Re: JavaのSwingの画像表示について

#2

投稿記事 by ISLe() » 10年前

Class#getResourceはクラスパスを走査します。
クラスパスの中に、当該クラスファイルを基準としたパスよりも前に合致するものがあるのでしょう。

Class#getResourceの戻り値を表示してみてください。
実際に見付かったファイルの絶対パス(URI形式)が分かります。

アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

Re: JavaのSwingの画像表示について

#3

投稿記事 by namachan10777 » 10年前

getClass().getResource()の戻り値は
file:/home/namachan/Project/Pronama/illust/sd06.png
となっていました。実際のパスは
/home/namachan/Project/Pronama/illust/sd06.png
です。
D言語!D言語!

アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

Re: JavaのSwingの画像表示について

#4

投稿記事 by namachan10777 » 10年前

すいません。お騒がせしました。
指定していた画像ファイルの大きさと比較用の画像ファイルの大きさが違っていて、それが原因だったようです。
勉強になりました。
D言語!D言語!

閉鎖

“C言語何でも質問掲示板” へ戻る