JTableに画像を2





昨日の記事(NetBeansでは画像が表示されないがコマンドラインで表示できた)で、きしだ氏のコメントと同じ事を、隣に座っている友人に指摘された。
いわく、「./を付けると、コマンドプロンプトで実行したらその時のカレントディレクトリが相対パスの起点になる」というのだ。実行されたファイルがどこにあるか、ではなく、どこでファイルを実行したか、によるのだと言う。


耳を疑ったね。


だってそうだろう?HTMLでそんなルール聞いたことある?


ネーよ!


HTMLはどこで誰が呼び出そうとも、相対パスの起点は呼び出されたHTMLファイルのあるディレクトリだ。例えばフレーム(画面分割)を指示するHTMLで別のHTMLを呼び出して、更にそのHTMLが画像やHTMLを呼び出しても、二つ目のHTMLに書かれた相対パスの起点となるのは二つ目のHTMLの有る場所になる。(CGIとかはまた別だが。)


そういう固定概念のせいでえらい遠回りをしたぜ。


しかしそういう大事なことはちゃんと書いてくれよ入門書!


と思って手元の入門書を片っ端からめくってみるが、絶対パス相対パスとが確かに書いてある本もあるがファイル同士の位置関係に対する書き方を解説してるだけで、コマンドプロンプトでの実行時ディレクトリへの注意とか、NetBeansではどうするんだ?とかの情報は書いてない。
まあ、そもそもNetBeansを扱ってる本が「創るJava」だけなので書いて無くてもしょうがないのかも知れないが。

絶対パス相対パスについて書いてないという信じられない本もある。「本格学習Java」キミの事だよ。目次にも索引にも無いぞ。まあ、コイツは画像を扱ってないし、NetBeans使ってないからいいのかもしれんが。
しかし「創るJava」にも書いてない。おいおいじゃあ昨日のような問題はNetBeansでどう処理させてるんだ?って思ったら画像ファイルは常に絶対パスでアドレスを指定してました。ぎゃふん。

eclipsではどうなってるんだろう?eclips使ってないし、本も持ってないからわからない。


さて、NetBeansから動かす時の相対パスの書き方はわかった。
なるほど、プロジェクトフォルダを起点にすればいいのね〜。*1
うむ、成功した!

なお、実験してみたところ、NetBeans上で実行したときは「./」が無くてもプロジェクトフォルダ直下から探し始めるようです。そしてjarファイルを一つ上のディレクトリから実行しても「./」無しの相対パスの画像は表示されず、imgフォルダを上の階層に引き上げると表示されました。


つまり、ここまでの実験において、「./」有る無しの差は認められませんでした。

もう面倒だからプロジェクトフォルダにimgフォルダを作ってそこに画像を置いておこう。これならソースを書き換える必要もないし。(HTMLでもそういうディレクトリ構成をしているサイトを良く見かける。HTML用のIDEも似たような仕様なのだろうか?それともそれ以前にこうする慣習がプログラミングの世界に出来上がっているのだろうか?そういう慣習をまとめた本って無いかなァ・・・。その内探しておこう。)


さて。


・・・問題はjar内部の画像にアクセスする方法だ。これがわからん。jarファイルを解凍すると
プロジェクト名\パッケージ名\img\japan.gif
てな感じでフォルダとファイルが出てくる。この相対パスでjapan.gifを表示しようとしてもダメ。jarファイルのあるフォルダに解凍したモノが置いてあると表示されちゃったりするがそれじゃあダメだろう。jarファイル内部のデータを使わなければ意味が無い。
パッケージ名\img\japan.gif
img\japan.gif
japan.gif
としてもダメ。
jarファイルをダブルクリックしてもコマンドプロンプトから起動しても画像が表示されない。ソースをいじってもプロジェクト内のimgフォルダの位置をいじってもダメ。
どうすりゃいいのッ!?
(という訳で→翌日の記事に続く)

*1:しかしこの機能、コマンドライン入力の時には当然だとしても、クラスファイル内で記述されているときは実行時ディレクトリじゃなくて読まれているクラスを起点にしてくれないかなぁ・・・HTMLの相対パスと同じに。