---
category: swing
folder: GroupableTableHeader
title: JTableHeaderでTableColumnのグループ化を行う
tags: [JTable, JTableHeader, TableColumn]
author: aterai
pubdate: 2016-05-02T00:35:46+09:00
description: TableColumnのグループ化を可能にし、JTableHeaderでの列結合を実現します。
image: https://lh3.googleusercontent.com/-DIZZyiOX9YU/VyYbXr9opNI/AAAAAAAAOTs/QhLBqtw5Z34ULclU9aZHnVjnEZMJvhJmgCCo/s800/GroupableTableHeader.png
---
* 概要 [#summary]
`TableColumn`のグループ化を可能にし、`JTableHeader`での列結合を実現します。%%[http://www2.gol.com/users/tame/swing/examples/JTableExamples1.html Groupable Header - JTable Examples 1]%%からの引用です。

#download(https://lh3.googleusercontent.com/-DIZZyiOX9YU/VyYbXr9opNI/AAAAAAAAOTs/QhLBqtw5Z34ULclU9aZHnVjnEZMJvhJmgCCo/s800/GroupableTableHeader.png)

* サンプルコード [#sourcecode]
#code(link){{
/** GroupableTableHeader
 * http://www2.gol.com/users/tame/swing/examples/JTableExamples1.html
 * @version 1.0 10/20/98
 * @author Nobuo Tamemasa
 * modified by aterai@outlook.com
 */
class GroupableTableHeader extends JTableHeader {
  private transient List<ColumnGroup> columnGroups;

  protected GroupableTableHeader(TableColumnModel model) {
    super(model);
  }

  @Override public void updateUI() {
    super.updateUI();
    setUI(new GroupableTableHeaderUI());
  }

  @Override public boolean getReorderingAllowed() {
    return false;
  }

  public void addColumnGroup(ColumnGroup g) {
    if (columnGroups == null) {
      columnGroups = new ArrayList<>();
    }
    columnGroups.add(g);
  }

  public List<?> getColumnGroups(TableColumn col) {
    if (columnGroups == null) {
      return Collections.emptyList();
    }
    for (ColumnGroup cGroup : columnGroups) {
      List<?> groups = cGroup.getColumnGroupList(col, new ArrayList<Object>());
      if (!groups.isEmpty()) {
        return groups;
      }
    }
    return Collections.emptyList();
  }
}
}}

* 解説 [#explanation]
上記のサンプルでは、`JTableHeader`に列のグループ化設定を追加し、`BasicTableHeaderUI#paint(...)`をオーバーライドしてヘッダセルの描画領域を変更することで、`TableColumn`の列結合を実現しています。

- %%[http://www2.gol.com/users/tame/swing/examples/JTableExamples1.html オリジナル]%%からの主な変更点:
-- ヘッダセルと本体セルがずれてしまうので、`header.getColumnModel().getColumnMargin()`で取得した余白を無視
-- グループ化設定の保持に、`Vector`ではなく`ArrayList`を使用
-- グループ化しない場合は、`null`ではなく`Collections.emptyList()`を返す
-- ヘッダセルと本体セルがずれてしまうので`header.getColumnModel().getColumnMargin()`で取得した余白を無視
-- グループ化設定の保持に`Vector`ではなく`ArrayList`を使用
-- グループ化しない場合は`null`ではなく`Collections.emptyList()`を返す
-- `BasicTableHeaderUI`からコピーしている各`private`メソッドを最新版に更新

* 参考リンク [#reference]
- %%[http://www2.gol.com/users/tame/swing/examples/JTableExamples1.html Groupable Header - JTable Examples 1]%%
-- オリジナル版
- [http://www.java2s.com/Code/Java/Swing-Components/GroupableGroupHeaderExample.htm Groupable(Group) Header Example : Grid Table « Swing Components « Java]
-- `revised by Java2s.com`で、いくつか変更点がある模様
-- `revised by Java2s.com`でいくつか変更点がある模様

* コメント [#comment]
#comment
#comment