- PR -

JTableのセル結合

1
投稿者投稿内容
りく
会議室デビュー日: 2006/11/27
投稿数: 2
投稿日時: 2006-11-27 00:47
初めまして。
今、SwingでJTable内のセル結合に悩まされています。
簡単にいいますと、Excelのように縦2行を1つのセルにしたり、
横3列を1つのセルにしようと思っております。

いろいろインターネットで調べたのですが、良い方法がみつかりません。
どなたかご存知の方がいましたら教えて下さい。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2006-11-27 10:50
「JTable 結合」で検索すると一番にこれが見つかりました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12930&forum=12&10
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2006-11-28 08:18
良い方法が分からないのか、方法が分からないのか分かりませんが、
良し悪しは、人それぞれなので書きませんが、基本的な方法は下記のとおりです。

1.セルの連結情報(起点、範囲)をなんらかの形で保持。
2.連結情報に基づいて、連結状態を描画。
上記をコードに落とせばよいだけです。
残念ながら、APIを組み合わせてもセルの連結はできません。

上記の連結状態を描画するのを実装するだけでしたら、
JTableとその先祖のクラスをソースコードレベルで理解している人であれば、
2,3時間もあれば十分、実装可能だと思います。
レンダラを加工して実装できるのであれば、ソースコードレベルでの理解も不要で、
もっと短時間でも可能かもしれません。

読みとり専用(選択状態や編集状態を考慮しない)であれば、
以上で終わりです。

ただ、困難なのはそのあとです。
キー、マウスによる選択状態をJTableと整合性を保つとなると話は別です。
実装者が、JTableに関連するほぼすべてのクラスをソースコードレベルで
理解していないと莫大な時間がかかるうえに、
まともにテストもデバッグもできない可能性もあります。

商用製品やJAVA以外の選択肢があるならば、他の道を探る方がコストが
掛からないと思います。

とか書きましたが、ソースを殆ど理解していなくても、
下のURLのような実装だったら、要求レベルによっては、
擬似的で簡便な実装なら可能なのかな?と、ちょっと思いました。
私は試していませんし、ちょっと実装が困難な気もしますが。
http://java-house.jp/ml/archive/j-h-b/026642.html

あと、びしばしさんが貼ってくれているスレッドの最後の本ですが、
Swingのコンポーネントをあまり知らない人には、有用かもしれませんし、
インスピレーションが湧けば、実装可能な状態であれば、良いかもしれません。
ただ、セルの結合の実装方法を目的に買うには、内容がちょっとしょっぱすぎます。

その本では、JTableをレイアウトマネージャ代わりに使用することを
主旨として、セルの結合の実装を書いているせいか、
サンプルコードは正常に動作しますが、TableModelのデータを
コンポーネントでないデータに変更すると、まともに動作しません。
簡潔にいうと、クリップ、編集、選択状態等が考慮されていません。

上述の知識がある実装者がいないのであれば、
個人的には商用製品を使用した方が良いのでは?と思います。
りく
会議室デビュー日: 2006/11/27
投稿数: 2
投稿日時: 2006-11-28 11:35
びしばしさん、未記入さん

返信ありがとうございます。
APIで簡単にできるような気がしたのですが、
未記入さんの言われてとおりAPIでセル結合ができない
ことがわかりました。

表示するだけの表なので、地道にセル結合用のプログラムを作ります。

昨日、サンプルソースを見つけたので、もし同じことで悩んでいる方が
いましたら参考にして下さい。
http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples4.html

いろいろとありがとうございました。
また、説明不足で申し訳ありませんでした。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2006-11-28 12:08
書き忘れました。

表示するだけで、表示内容が文字列やイメージであって、
見栄えを気にしないのであれば、TableCellRenderでHTMLのTableタグを
記述するのが最短の実装コストです。
例えば、javax.swing.table.DefaultTableCellRender.setText() or setValue()に
HTMLを記述すれば完了です。

行、列を1つだけ用意して表示内容をすべてHTMLのTableで表示するか、
セル毎にHTMLのTableを表示するかはご自由に。

ただ、行、列を1つだけ用意してHTMLのTableを使って実現する場合、
そもそも、JTableを使用する必要はありませんが。
1

スキルアップ/キャリアアップ(JOB@IT)