---
category: swing
folder: FixedSummaryRow
title: JTableにソートされないサマリー行を表示する
tags: [JTable, TableRowSorter, RowFilter]
author: aterai
pubdate: 2009-04-27T14:50:32+09:00
description: JTableの行をソートしても、常に最終行にサマリーを表示します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTM63Y0s8I/AAAAAAAAAZ8/o3lbm9QBcIs/s800/FixedSummaryRow.png
---
* Summary [#summary]
`JTable`の行をソートしても、常に最終行にサマリーを表示します。
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTM63Y0s8I/AAAAAAAAAZ8/o3lbm9QBcIs/s800/FixedSummaryRow.png)
* Source Code Examples [#sourcecode]
#code(link){{
public JTable makeTable() {
JTable table = new JTable(model);
RowFilter<TableModel, Integer> filter = new RowFilter<>() {
@Override public boolean include(
Entry<? extends TableModel, ? extends Integer> entry) {
int i0 = table.convertRowIndexToView(entry.getIdentifier());
return i0 != 0;
}
};
TableRowSorter<TableModel> s = new TableRowSorter<TableModel>(model) {
@Override public void toggleSortOrder(int column) {
RowFilter<? super TableModel, ? super Integer> f = getRowFilter();
setRowFilter(null);
super.toggleSortOrder(column);
setRowFilter(f);
}
};
s.setRowFilter(filter);
// s.setSortsOnUpdates(true);
s.toggleSortOrder(1);
table.setRowSorter(s);
TableColumnModel col = table.getColumnModel();
for (int i = 0; i < col.getColumnCount(); i++) {
TableCellRenderer r = table.getDefaultRenderer(model.getColumnClass(i));
col.getColumn(i).setCellRenderer(new TableCellRenderer() {
@Override public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JLabel l;
if (row == model.getRowCount() - 2) {
int i = getSum(table.convertColumnIndexToModel(column));
l = (JLabel) r.getTableCellRendererComponent(
table, i, isSelected, hasFocus, row, column);
l.setBackground(Color.ORANGE);
} else {
l = (JLabel) r.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
l.setBackground(Color.WHITE);
}
l.setForeground(Color.BLACK);
return l;
}
});
}
return table;
}
}}
* Description [#explanation]
* Description [#description]
- モデル(`Integer`)の先頭と末尾にサマリーを表示する行を追加
-- 値は`Integer.MIN_VALUE`と`Integer.MAX_VALUE`を使用してソートしても先頭と末尾になるよう設定
- ソートで表示上の先頭になった行を`RowFilter`で非表示化
* Reference [#reference]
- [http://www.jroller.com/santhosh/date/20070812 Sorting Table with Summary Row - Santhosh Kumar's Weblog]
- [https://community.oracle.com/thread/1356123 Swing - Sort rows in JTable except the last row]
* Comment [#comment]
#comment
#comment