JTableに画像を3





昨日の記事(NetBeansで実行すると画像が表示されるがjarダブルクリックでは表示できない)に対して一昨日と昨日のコメントで、Guernsey氏ときしだ氏が教えて下さったイディオム

new ImageIcon(getClass().getResource("img/brazil.gif"));

を試してみた。*1→jarファイルをダブルクリック・・・


 成功!





 いやーよかった。ご教授ありがとうございました。*2
 これで今夜も安心して配布できる!*3


しかし、いままでと違う反応が返ってきてちょっとビックリ。
わざと画像が存在しないパスを書いたらコンパイルは通すくせに、実行すると

Exception in thread "main" java.lang.NullPointerException
        at javax.swing.ImageIcon.<init>(ImageIcon.java:138)
        at tablegiftest.Main.<init>(Main.java:21)
                                   ↑配列宣言開始行
        at tablegiftest.Main.main(Main.java:41)
                                  ↑Mainクラスコンストラクト行

コマンドラインに返って動作せず。最初ダブルクリックで試した時はエラーメッセージすら無いから何度もダブルクリックしてしまった。三回も無駄なダブルクリックを強いられ精神的苦痛を味わった!謝罪と賠償を【以下略】。
これまでの様に空白を表示してくれればいいのに。しかもヌルポを出しているのはImageIconじゃないか!jarの外部の画像を読むときは、そこに画像が有るか無いか分からないから空白にしてでもとりあえず動作を保証してるのはとても良い。でもそこまで配慮するならjarにまとめる時に画像が存在しないことを検出してコンパイルエラーを出せよ。コンパイル通しておいて「画像が無いからヌルポ」だなんてバカすぎる。*4
 それが面倒ならこれまで通り空白を出力しておけ


 この半端仕事めがぁぁぁぁ!


 まったく、なにが”Write once Run Anywhere”だか。

別のコードを書く羽目になってしまいましたよ(笑)


もっとも、環境ごとに修正を入れなければならないのは現在のJavaでは珍しくないらしいですが。

*1:上記のリンク先では「getClass().getClassLoader().getResource("./example/test.png");だとjar内にパッケージした時うまくいかない。」とある。一昨日のきしだ氏の「./」への指摘はこの事と思われる。

*2:なお、間に「.getClassLoader()」を入れると動作しない。下記と全く同じヌルポエラーが発生する。しかし上記のリンク先サイトではこれを入れたソースも書いている。Javaのバージョンアップ時に仕様変更でもあったのだろうか?

*3:・・・ウソ。どうせ他にも色々落とし穴があるに決まっている。徹底的な動作テストをしない限りとてもじゃないが安心して配布など出来ない。

*4:しかもこのエラーメッセージだと、どの行のImageIconでエラー出てるのかすら判らねー(怒)!

今日は引用を多用してみました。読みづらいですか?