JTableに画像を1





 作ろうとしているゲームとは違う話なのだが、Javaでテープル(表)に画像を縦横に表示するアプリケーションを作る必要が出てきた。
 大量の画像かつ欠損がある可能性があるから、ただ並べただけでは画像の並び方に不具合が出る可能性があるのでやっぱりテープルが望ましい、と思う。
 HTMLの経験から、テーブルのセル(エクセルのセルと似た概念)に画像を表示するのは簡単だろうと思ったのだが、甘かった!




 まず、手元の初心者用入門書を読んでも方法が書いてない。
 googleで”java table 画像”で検索してみる。

イヌでもわかるJavaScript講座

四季でテーブルの背景画像(計4枚の画像)が変わるjavascriptとHTML内 ...
アクセス毎に画像表示を変えるJavaスクリプトの設置方法。ホームページ ...
雛形倶楽部情報データベース [データ詳細]
JavaScript:画像拡大表示ライブラリ「PopBox」、HTMLのテーブルより ...
TABLEの背景画像をCSSに変更したい。 -OKWave
Child Tree (HP Q&A BBS) [One Thread Res View / javascriptの ...
透けるテーブル table を作る-ホームページ作成の大技と小技
スクロールバーに画像
おしえてBP! 縮小画像をマウスオーバーで画像を切り替えるjava ...

 全部JavaScriptだよ!どうすりゃいいんだ!?




 やっと13件目で

[http://java-house.jp/ml/archive/j-h-b/045696.html:title=[JavaHouse-Brewers:45696] JTable における画像表示が出来ない]
getClass(); } } こんな感じでテーブルに画像を表示させようとしました。 ところが、 実際に画面を起動すると、Javaコンソール画面にjava.security.AccessControlException : access denied (java.io. ...

 が、やっとHIT。しかし意味がよく分からない。
・・・ってググり方が悪かったようだ。”java JTable 画像”で再度検索。(画像もってくるのはめんどくさいので省略)

#
java JTable 画像 のイメージ検索結果
- 画像を報告この中に不快/不適切な画像がある場合: 報告 キャンセルご報告いただきありがとうございます。
画像1画像2画像3画像4

文字列以外のデータをテーブルに表示する - JTableクラス - Swing
ImageIcon icon = new ImageIcon("画像ファイル名");. 国旗のアイコンは『世界の国旗アイコン』を使わせて頂きました。 まずはJTableのコンストラクタに渡すデータに、 画像も含めて試してみます。

 有望そうだ。画像の一つ目をクリック。おう!テーブルのセルに画像が貼り付けられている例がある!ソースファイルはどこだ!?
 ・・・無い。どういうサイトなんだここ?・・・英語だし、メンドクサイ上にソースファイル無いなら時間の無駄だから調査はしないで撤退。
 日本語の検索結果の一つ目を見てみる。・・・おお!これは先日発見したサイトJavadriveではないか!期待大!

{new ImageIcon("./img/japan.gif"), "日本", "3勝", "0敗", "1分"},

 ほほう、こうやってtableデータを定義するのか。簡単そうだな!と思ったらこれはマチガイの例らしい。

この理由なのですが、JTableは各セルを表示する際に、TableModelで定義されている"getColumnClass"メソッドを使って、その列のクラス名を調べるようにしているようで

本来は引数で指定した列に定義されているクラス名を返せばいいのですが、引数がなんであれ"Object"クラスを返すようになっています。

これを修正するにはDefaultTableModelクラスを継承し、"getColumnClass"メソッドをオーバーライドしたクラスを用意して利用するようにします。

 これってつまり不具合なんじゃね?getColumnClassって言うならちゃんとクラス名を返さなきゃだめだろ!?それが常にObjectを返すだなんてあきれてモノも言えねぇ。HTMLの簡単さを見習え!セル内部にというタグを入れるだけで表示出来るんだぜ!?HTMLより何年も後に出て改良が重ねられてるJavaで何でこんな手間を掛けなきゃならないんだよ!これじゃHTMLよりも低級言語だぞ!(あ、モノ言っちゃった。)


 まあそれはともかく、とにかくこれの対処法を丁寧にソース解説してくれてるので、さっきのメーリングリストの回答もすっきり理解できた。
 ちゃんと動くソース全体も記述されているので喜んで丸ごとNetBeansに新しくTestTableプロジェクト作ってコピペしてメインファイルにする。画像は同じディレクトリのimgフォルダにまとめておけばよさそうだ、というわけでソースファイルに直接コピペ。できたー!ラクチンラクチン!
 よーし、とりあえずNetBeans上でメインクラスを実行してみよう。



 ・・・なんでやねーん。


 あれ?コレと似たこと前にも無かったかなァ?
 ああ、アレだ、テクスチャー貼り付け不能事件だ。まさかアレとおんなじ結果にならないだろうな・・・。


 と思ったら全く同じ結果になった。クラスファイルの周辺にどんなにガンバって画像を配置してもNetBeans上で実行する限り画像が現れることは無く、jarファイルと同じフォルダに配置してしかもコマンドプロンプトから実行して初めて画像がアプリ上に現れる。

 今回は更に追加実験で、クラスファイルをコマンドプロンプトから実行してみた。
 こっちも成功。imgファイル内からgifファイルを移動させて実行すると失敗することから両方とも実行ファイルのあるフォルダにあるimgファイルを読むようだ。


 と、思ったらそうではないのだった!


(翌日の記事に続く)