Swing/FixedSummaryRow の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/FixedSummaryRow へ行く。
- Swing/FixedSummaryRow の差分を削除
--- 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] `JTable`の行をソートしても、常に最終行にサマリーを表示します。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTM63Y0s8I/AAAAAAAAAZ8/o3lbm9QBcIs/s800/FixedSummaryRow.png) * サンプルコード [#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; } }} * 解説 [#explanation] 上記のサンプルでは、以下のようにしてサマリー行を作成しています。 - モデル(`Integer`)の先頭と末尾にダミー行を追加 - モデル(`Integer`)の先頭と末尾にサマリーを表示する行を追加 -- 値は`Integer.MIN_VALUE`と`Integer.MAX_VALUE`を使用してソートしても先頭と末尾になるよう設定 - ソートで表示上の先頭になった行を`RowFilter`で非表示化 * 参考リンク [#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