概要

TableColumnのグループ化を可能にし、JTableHeaderでの列結合を実現します。Groupable Header - JTable Examples 1からの引用です。

サンプルコード

/** 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();
  }
}
View in GitHub: Java, Kotlin

解説

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

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

参考リンク

コメント