- - PR -
JTableのセル結合
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-11-27 00:47
初めまして。
今、SwingでJTable内のセル結合に悩まされています。 簡単にいいますと、Excelのように縦2行を1つのセルにしたり、 横3列を1つのセルにしようと思っております。 いろいろインターネットで調べたのですが、良い方法がみつかりません。 どなたかご存知の方がいましたら教えて下さい。 |
|
投稿日時: 2006-11-27 10:50
「JTable 結合」で検索すると一番にこれが見つかりました。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=12930&forum=12&10 |
|
投稿日時: 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-28 11:35
びしばしさん、未記入さん
返信ありがとうございます。 APIで簡単にできるような気がしたのですが、 未記入さんの言われてとおりAPIでセル結合ができない ことがわかりました。 表示するだけの表なので、地道にセル結合用のプログラムを作ります。 昨日、サンプルソースを見つけたので、もし同じことで悩んでいる方が いましたら参考にして下さい。 http://www.crionics.com/products/opensource/faq/swing_ex/JTableExamples4.html いろいろとありがとうございました。 また、説明不足で申し訳ありませんでした。 |
|
投稿日時: 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