From window, to wind

趣味のゲームとJavaプログラムなどについて 適当に書き綴るブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JARファイル中の画像ファイルへのアクセス

ようやくJARファイル中への画像ファイルの呼び出しができたのでまとめます。

まずはソースコード


package program;

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Testjpg {

    /**
     * @param args
     */
   
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ

        JFrame jf = new JFrame("testjpg");
       
        Dimension size = new Dimension(100,100);
       
        JButton jb1 = new JButton("Close1");
        jb1.setPreferredSize(size);
        JButton jb2 = new JButton("Close2");
        jb2.setPreferredSize(size);
        JButton jb3 = new JButton("Close3");
        jb3.setPreferredSize(size);
        JButton jb4 = new JButton("Close4");
        jb4.setPreferredSize(size);
       
        GBLayout gbl = new GBLayout();
       
        try{
            InputStream is1 = gbl.getClass().getResourceAsStream("JPG"+File.separator+"testjpg.jpg");
            BufferedImage image1 = ImageIO.read(is1);
            jb1.setIcon(new ImageIcon(image1));
        }catch(Exception e){
            System.out.println(e);
        }
       
        try{
            String str = "JPG"+File.separator+"testjpg.jpg";
            InputStream is2 = gbl.getClass().getResourceAsStream(str);
            BufferedImage image2 = ImageIO.read(is2);
            jb2.setIcon(new ImageIcon(image2));
        }catch(Exception e){
            System.out.println(e);
        }
       
        try{
            InputStream is3 = gbl.getClass().getResourceAsStream("testjpg.jpg");
            BufferedImage image3 = ImageIO.read(is3);
            jb3.setIcon(new ImageIcon(image3));
        }catch(Exception e){
            System.out.println(e);
        }
       
        try{
            InputStream is4 = gbl.getClass().getResourceAsStream("JPG/testjpg.jpg");
            BufferedImage image4 = ImageIO.read(is4);
            jb4.setIcon(new ImageIcon(image4));
        }catch(Exception e){
            System.out.println(e);
        }
       
       
        GBLayout.addGB(jb1, jf.getContentPane(), 0, 0, 1, 1);
        GBLayout.addGB(jb2, jf.getContentPane(), 1, 0, 1, 1);
        GBLayout.addGB(jb3, jf.getContentPane(), 0, 1, 1, 1);
        GBLayout.addGB(jb4, jf.getContentPane(), 1, 1, 1, 1);
       
        jf.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
       
        jf.pack();
        jf.setLocation(300, 300);
        jf.setVisible(true);
       
    }

}



パッケージの様子
キャプチャtestjpg

Eclipseでの実行画面
Eclipse_testjpg.jpg

JARファイルでの実行画面
JAR_testjpg.jpg


パッケージ内のリソースへのアクセスとして
gbl.getClass().getResourceAsStream("…")
としているのですが、thisを使わずgblを使っているのはメインクラス中であるため。
以前はURLを使ったのですがうまくいかなかったのでInputStreamに落としています。(おそらく使い方が悪い)
今回4種類の方法で行ったのですが、Eclipse上ではどれもうまく呼び出せているのですが、JARファイルにすると後ろの二つしかうまくいきません。
一応ネットとかで調べてみて、ファイル名の前に/を入れるとJARファイルの中にうまくアクセスできないことは分かりました。
まず最初にJPGフォルダを作りその中に画像ファイルを入れていたのですがうまくいかず、次にJPGフォルダからパッケージ内に移し実行したところis3において成功。その後File.separatorを使わず実行したところis4が成功。
どうもFile.sesparatorが良くなかったみたいです。URLを使っていた時もFile.separatorのせいかも。

参考ページ
Javaリソース・プロパティーメモ(Hishidama's Java resource/property Memo)
Java Laboratory 画像ファイルのロードの比較

直後の追加
URLでも成功。

URL url1 = gbl.getClass().getResource("JPG/testjpg.jpg");
jb1.setIcon(new ImageIcon(url1));
URL url2 = gbl.getClass().getResource("testjpg.jpg");
jb2.setIcon(new ImageIcon(url2));
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://kagenyan.blog69.fc2.com/tb.php/21-084997e3
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。