Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

eclipse 相対パスによる画像表示

java swing eclipseにて絶対パスによる画像表示はできるのですが「相対パスによる」画像表示ができません。
カレントディレクトリはeclipse/HelloWorld/src/testです。
testはパッケージで
画像自体はgifファイルでtestパッケージの中に入っていて画像を呼び出すファイル(part18.java)もtestパッケージに入っています。

testパッケージに入っている「part18」のソースです。(絶対パスでの画像表示はできます。)

package test;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;


public class part18 {

    public static void main(String[] args) 
    {
        System.out.println("やっはろー");
        
        // ウィンドウフレームを作成、表示
        JFrame    jf = new JFrame();
        jf.setBounds(20,50,800 ,450);
        jf.setVisible( true );
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //    親パネルを作成し、フレームに貼り付け
        JPanel jp = new JPanel();
        jp.setBackground( Color.BLACK );
        jf.add( jp );
        
        //    ラベルを作成し、親パネルに貼り付け
        JLabel jl = new JLabel("魔王が世界を滅ぼそうとしています");
        Font f = new Font(Font.MONOSPACED,
                     Font.ITALIC,
                     40);
        jl.setFont( f );

        jl.setForeground( new Color(255,128,0) );
        jp.add( jl );
        jf.setVisible( true );
        
        //パネルを作成し、親パネルに貼り付け
            JPanel jpChild = new JPanel();
            jpChild.setBackground( Color.RED );
            jp.add( jpChild );
            
            //    ラベルを作成し、子パネルに貼り付け
            JLabel jlChild = new JLabel("トンヌラ Lv99 HP999/999");
            jlChild.setFont( f );
            jlChild.setForeground( Color.WHITE);
            jpChild.add( jlChild );
            jf.setVisible( true );
            
            //    画像付きラベルを作成し、親パネルに貼り付け
            JLabel jlImage = new JLabel( new javax.swing.ImageIcon("/Users/○○/Desktop/mine/sozai/img15_1.gif") );
            jlImage.setSize( 640 , 481 );
            jp.add( jlImage );
            jlImage.setVisible( true );
    }

}

関係ないかも知れませんが関係する残り二つのソースも貼り付けさせて頂きます。

「HelloWorld.java」

package test;

public class HelloWorld {
    static String name = "すけさん";
    static int lv = 30; //プレイヤーのレベル
    static int hp = 30; //プレイヤーのヒットポイント
    static double gold = 50.0; //プレイヤーの所持金

    public static void main(String[] args) throws java.io.IOException
    {
        Console.putJyosyou(); //序章を表示
        
        putCommand(); //コマンドを表示
        
        if(hp == 0){
            return;
        }
        
        //魔王を倒しにいく        
        if(lv < 40){        //レベルが40未満の場合
            Console.putGameOver();    //ゲームオーバー画面を表示
        } else {            //レベルが40以上の場合
            Console.putGameClear(); //ゲームクリアの画面を表示
        } 
    }
    
    /**
     * コマンドを表示します。
     * @throws java.io.IOException 入出力エラーが発生した場合
     */
    public static void putCommand() throws java.io.IOException{
        Console.put("1.魔王を倒しに行く");
        Console.put("2.修行する");
        Console.put("3.宿屋に泊まる");        
        switch( inputCommand() ){    //魔王を倒しに行く
        case '1':{
            Console.put("魔王が現れた!");
        break;
        }
        case '2':{    //2.修行する
            syugyou();
            break;
        }
        case '3':{    //宿屋に泊まる
            if( gold >= 9.95 ){
                hp = lv;
                gold -= 9.95;
            }
            Console.putStatus();
            putCommand();
            break;
        }
      }
    }
    /**
     * 修行する。
     */
    public static void syugyou() throws java.io.IOException{
    java.util.Random    r = new java.util.Random();
        
    //    敵出現
    int     e = r.nextInt( 10 ) + 1;    //敵の数
    Console.put("敵が" + e + "匹現れた");
    
    String m = "( ^∀^)";
    String s = " " + m;
    
    for(int i=0; i<e; i=i+1){
        System.out.print(s);
    }
    System.out.print("\n");
    
    //HPを減らす
    int     d = r.nextInt( 8 );
    hp -= d;
    if( hp < 0 ){
        hp = 0;
    }
    Console.put(name + "は " + d + "ポイントのダメージを受けた!" );
    
    //    レベル上昇
    lv += e;
    Console.put("レベルが" + lv + "になった" );
    
    Console.putStatus();
    if(hp == 0){
        Console.put("GAME OVER");
    }
    putCommand();
    }
    /**
     * 入力ストリームからデータの次のバイトを読み込みます。
     * 改行コードは無視されます。
     * 
     * @return        データの次のバイト。ストリームの終わりに達した場合は-1
     * @exception java.io.IOException 入力エラーが発生した場合
     */
    
    public static int inputCommand() throws java.io.IOException{
    
    int c = System.in.read();

    if( c == 10 || c == 13 ){    //改行コード( CR 又は LF ) の場合
        return( inputCommand() );
        }
    return( c );
    }
}

「Console.java」

package test;
public class Console {
/**
 * 序章を表示します
 */
static void putJyosyou(){
    put("魔王が世界を滅ぼそうとしています。");
    putStatus();
}

public static void putStatus(){
    put("------------------------");
    put(" " + HelloWorld.name + " LV" + HelloWorld.lv + " HP" + HelloWorld.hp + " " + HelloWorld.gold + "G");
    put("------------------------");
}

/**
 * ゲームオーバー画面を表示します。
 */
static void putGameOver(){
    put(HelloWorld.name + "は魔王に敗れました!");
    put("GAME OVER");
}

/**
 * ゲームクリア画面を表示します。
 */
static void putGameClear(){
    String s0 = HelloWorld.name + "は魔王を倒しました";
    put( s0 );
    
    System.out.print( "レベル" + HelloWorld.lv );
    
    if(HelloWorld.lv > 200){
        put("なので魔王ゴミでした");
    } else if(HelloWorld.lv > 120){
        put("なので魔王弱すぎでした");
    } else if(HelloWorld.lv > 80){
        put("なので余裕でした");
    } else if(HelloWorld.
            lv > 50){
        put("でしたが倒せました");
    } else {
        put("でしたので苦戦しました");
    }
    put("GAME CLEAR");
}

/**
 * 引数で指定された文字列を表示します。
 * 
 * @param str    表示対象の文字列
 */
static void put( String str ){
    System.out.println( str );
    }
}

画像表示を相対パス(eclipse上)で表示するにはどうすれば良いでしょうか?
またはどこが間違っているでしょうか?
バカでスミマセンお願いします。

1

回答

801

閲覧

1件の回答

評価

0

最後の1行は余計だ。

相対パスで表示できないのは、カレントディレクトリを意識していないからだろう。
ただ、モジュール内に画像を含める場合大抵はリソースとして扱う。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。