Swing/FixedSummaryRow のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FixedSummaryRow へ行く。
- 1 (2009-10-09 (金) 21:36:06)
- 2 (2013-01-10 (木) 17:35:02)
- 3 (2013-08-31 (土) 01:43:28)
- 4 (2013-10-18 (金) 15:57:59)
- 5 (2014-06-12 (木) 21:33:04)
- 6 (2014-11-01 (土) 00:42:03)
- 7 (2014-11-25 (火) 03:03:31)
- 8 (2015-12-01 (火) 15:00:09)
- 9 (2017-05-30 (火) 20:31:17)
- 10 (2018-05-18 (金) 17:30:27)
- 11 (2020-05-14 (木) 16:19:37)
- 12 (2021-11-07 (日) 05:28:51)
- 13 (2023-07-27 (木) 11:53:02)
- 14 (2023-10-06 (金) 11:25:50)
- title: JTableにソートされないサマリー行を表示する tags: [JTable, TableRowSorter, RowFilter] author: aterai pubdate: 2009-04-27T14:50:32+09:00 description: JTableの行をソートしても、常に最終行にサマリーを表示します。
概要
JTable
の行をソートしても、常に最終行にサマリーを表示します。
Screenshot
Advertisement
サンプルコード
public JTable makeTable() {
final JTable table = new JTable(model);
final 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;
}
};
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++) {
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;
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、以下のようにしてサマリー行を作成しています。
- モデルの先頭と末尾にダミー行を追加
- 値は、
Integer.MIN_VALUE
と、Integer.MAX_VALUE
でソートしても先頭か末尾にくるようにしておく
- 値は、
- ソートでどちらかが先頭行(表示上)になった場合、フィルタでこれを非表示にする
参考リンク
- Sorting Table with Summary Row - Santhosh Kumar's Weblog
- Swing - Sort rows in JTable except the last row