4

私はSwingを初めて使用し、今日はJTableコンポーネントに苦労しています。やや凝ったテーブルを作ろうとしているので、まだどこでも探している特定の答えを見つけることができませんでした。

テーブルの最上部にヘッダーの「グループ」を配置したいと思います。これは、テーブル全体にまたがる3行または4行を意味し、さまざまな列を「グループ化」して、基本的にそれらを分割します。

例(目の疲れを許してください):

////////////////////////////////ANIMALS//////////////////////////
/////////Mammals///////////////////////Rodents///////////////////
////People/////Dogs//////////Rats/////Rodents of Unusual Size////

スラッシュ( "/")は空白を示します。「ANIMALS」というタイトルの最初のヘッダーは、テーブル内のすべての列を参照します。2番目のヘッダーはANIMALSを分割し、以下同様に続きます。3番目の最後のヘッダーの後に、実際のテーブルが表示されます。各行には、動物のタイプごとに1つずつ、合計4つの列があります。

明らかにこれは例であり、おそらく悪い例ですが、これは私が「ヘッダーのパーティション化」によって意味するものです。

私の質問: JTableHeaderとTableColumnModelがこの機能をどのようにサポートしているかわかりません。もしそうなら、誰かが私を正しい方向に動かすことができますか?そうでなければ、Swingアプリがこのようなものを必要としたのはこれが初めてではありません。誰かが知っているサードパーティのコンポーネントはありますか?

また、行のグループを表す「スペーサー」またはスパニング行をテーブル全体に散らばらせることができるようにしたいと思います。これらのスペーサーは(ヘッダーのようにテーブルの上ではなく)テーブル内に存在しますが、すべての列にまたがり、後続の行で表されるグループの名前を表す単一のラベルを持ちます。繰り返しになりますが、Swingがこれをサポートしているとは思いません。何かアイデアはありますか?

ありがとう、そして私は本当にひどい例/図面をお詫びします。

4

4 に答える 4

2

この由緒ある複数行ヘッダーの例を採用できる可能性があります。

于 2011-08-17T00:14:36.650 に答える
1

セル(行/列の両方)のグループ化または分割は、ヘッダーでもテーブル自体でも、コアSwingではサポートされていません。設計によるJTableは、汎用グリッドではありません。グリッドのような動作とビジュアルを微調整しようとすると、そのデザインと戦うことになります。行うことはできますが、達成するのは簡単ではありません。@Trashgodはそれらの戦いのいくつかを指摘しました(それらはまだ機能しますか?それらは古い第一世代の飼いならされた例のように見えますか?)。JIDEは、それをサポートする商用製品です(免責事項:本番環境で使用したことはありません:-)

于 2011-08-17T10:43:33.343 に答える
1

デフォルトでは、JTableにはヘッダーの行が1つしかありません(JTableの行ではなく、JTableHeaderです)。とにかく、ヘッダーのように見える方法で最初のn個の非ヘッダー行を表示するTableCellRendererを実装できます。

手順は次のとおりです。

  1. TableCellRendererを実装して、ヘッダーのセルのような目的の行の通常のJTableのセルを表示します

お気に入り:

public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column){   

    this.setOpaque(true);
    TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
    return renderer.getTableCellRendererComponent(table, value, isSelected,
          hasFocus, row, column);
}
  1. 目的のセルレンダラーを返すには、JTableを拡張し、次のメソッドを実装します。

    public TableCellRenderer getCellRenderer(int row, int column){}
    

とにかく、要件に応じて解決すべき別の問題があります。JTableには固定数の列があるため、その結果を達成するための回避策を見つける必要があります。

于 2011-08-16T20:21:37.800 に答える
0

これが役立つかもしれませんGroupableTableHeader

于 2012-04-16T05:40:02.543 に答える