JTableHeaderでTableColumnのグループ化を行う
Total: 8163
, Today: 3
, Yesterday: 13
Posted by aterai at
Last-modified:
概要
TableColumn
のグループ化を可能にし、JTableHeader
での列結合を実現します。Groupable Header - JTable Examples 1からの引用です。
Screenshot
Advertisement
サンプルコード
/** 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
メソッドを最新版に更新
- ヘッダセルと本体セルがずれてしまうので
参考リンク
Groupable Header - JTable Examples 1- オリジナル版
- Groupable(Group) Header Example : Grid Table « Swing Components « Java
revised by Java2s.com
でいくつか変更点がある模様