Posted by terai at 2009-04-27
JTableにソートされないサマリー行を表示する
JTableの行をソートしても、常に最終行にサマリーを表示します。
サンプルコード
public JTable makeTable() {
final JTable table = new JTable(model);
final RowFilter<TableModel,Integer> filter = new RowFilter<TableModel,Integer>() {
@Override public boolean include(
Entry<? extends TableModel, ? extends Integer> entry) {
int i0 = table.convertRowIndexToView(entry.getIdentifier());
return i0 != 0;
}
};
final 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++) {
final TableCellRenderer r = table.getDefaultRenderer(model.getColumnClass(i));
col.getColumn(i).setCellRenderer(new TableCellRenderer() {
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;
}
解説
上記のサンプルでは、以下のようにしてサマリー行を作成しています。
- モデルの先頭と末尾にダミー行を追加
- 値は、Integer.MIN_VALUEと、Integer.MAX_VALUEでソートしても先頭か末尾にくるようにしておく
- ソートでどちらかが先頭行(表示上)になった場合、フィルターでこれを非表示にする
参考リンク
- Sorting Table with Summary Row - Santhosh Kumar's Weblog
- Swing - Sort rows in JTable except the last row