• 締切済み

JTableの複雑なヘッダー

下記サイトのGroupableHeaderExampleを参考にし、複数ヘッダを作成、使用していました。 しかし、バージョン1.4以降のJREでヘッダの上段部分が潰れるようになってしまい困っています。 どなたか、ご指導よろしくお願いします。 http://web.archive.org/web/20030418025148/www2.gol.com/users/tame/swing/examples/JTableExamples1.html

みんなの回答

回答No.3

回答ではなく、報告ですが、 JavaSE 6 update7 では上記の対策でOKでしたが、 最新の JavaSE6 update10 ではNGでした。 また、プログラム修正かなぁ...

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.2

>なぜこれで解決するのか 実は僕もよく知らないのです・・・。 「想像」+「勘」で答えてみます。 (自信度5%) ■まず前提 (1)-各swingコンポーネントのuiは、どうやって設定するのか- たぶん、setUI()で設定される・・・気がします。 (2)-各swingコンポーネントのデフォルトのuiは、いつ決定されてるのか- インスタンス生成時(コンストラクタ内)など・・・のような気がします。 例えばJPanelは JPanel{  ・・・  ・・・  updateUI();//←最終的にsetUI()に行き着く } (3)-JComponentA#updateUI()って何?- 各swingコンポーネントごとに実装(※上書き)されてるようですが、 その中身はたいてい public void updateUI() {  setUI((HogeUI)UIManager.getUI(this)); } (4)-UIManager.getUI()って何?- swingフレームワークが規定する、「デフォルトのUI決定ルーチン」が きっと実装されてる・・・と思ってます。 (※たとえば、swingアプリを作った際、プログラマがなにもしなくても、 各コンポーネントにはデフォルトでなんらかのUIが適用されている) ■結論 ようするにJTableのheaderに独自のUIを適用したいなら table=new JTable();//テーブルを作成して header=table.getTableHeader();//テーブルのヘッダを取り出し header.setUI(new HogeUI());//ヘッダにUIを適用 のようにすればいいということです。 ようは、それだけです。 この方法が、一番わかりやすいと思います。 ■おまけ で、ひとつの考え方として、 この(上記「結論」部で書いた、)「独自UI適用処理」を 「headerのコンストラクタ内に埋め込んでしまおう」 という方針も、悪くはないと思います。 ようするに class HogeTableHeader{  HogeTableHeader(){   ・・・   setUI(new HogeUI());  } } というふうに。こうすれば、headerインスタンス生成時には、 自動的にheaderのUIも、独自のものに設定されていて便利ですよね。 例のサイトのサンプルは、この考えに基づいてます。 しかし、このサンプルで使っている Table(※JTableクラスの匿名インナークラス?)のコンストラクタは、 JTable(){  ・・・  header=createDefaultTableHeader()://ヘッダ生成  //(当然、このときにheaderには独自UIがすでに設定されてる)  ・・・  updateUI();//テーブルのUIを設定 } となっていて、ここのupdateUI()メソッド(※JTable#updateUI())の実装は updateUI(){ ・・・ ・・・ header.updateUI();//←jdk1.5から存在。 } となっています。で、このheader(※JTableHeaderインスタンス?)の updateUI()の実装は、上記(3)のような、 「デフォルトUIを設定」するような実装 になってます。 これでは「headerにせっかく独自UIを設定した」意味がないので、 ここを書きつぶし(※上書きし)ました。 書きつぶすのは、ここじゃなくても、どこでもよかったのですが、 元のサンプルの方針(※独自Headerクラス内でUI決定)に従ってみました。

fafnir
質問者

お礼

詳しい説明ありがとうございます。 本当に助かりました!

  • kacchann
  • ベストアンサー率58% (347/594)
回答No.1

GroupableTableHeader.javaに public void updateUI(){} と追記。

fafnir
質問者

お礼

出来ました! 非常に助かりました。ありがとうございます。

fafnir
質問者

補足

出来たのですが、なぜこれで解決するのかが今ひとつ理解に苦しんでおります。 よろしければ参考にしたいので簡単にでも、お聞きかせ願えますでしょうか。

関連するQ&A