• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableにソートされないサマリー行を表示する
#navi(../)
#tags(JTable, TableRowSorter, RowFilter)
RIGHT:Posted by &author(aterai); at 2009-04-27
*JTableにソートされないサマリー行を表示する [#gb96ab51]
``JTable``の行をソートしても、常に最終行にサマリーを表示します。
---
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`の行をソートしても、常に最終行にサマリーを表示します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTM63Y0s8I/AAAAAAAAAZ8/o3lbm9QBcIs/s800/FixedSummaryRow.png)

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTM63Y0s8I/AAAAAAAAAZ8/o3lbm9QBcIs/s800/FixedSummaryRow.png)

**サンプルコード [#n2f33436]
* サンプルコード [#sourcecode]
#code(link){{
public JTable makeTable() {
  final JTable table = new JTable(model);
  final RowFilter<TableModel,Integer> filter = new RowFilter<TableModel,Integer>() {
  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;
    }
  };
  final TableRowSorter<TableModel> s = new TableRowSorter<TableModel>(model) {
  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.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));
  for (int i = 0; i < col.getColumnCount(); i++) {
    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) {
      @Override public Component getTableCellRendererComponent(
          JTable table, Object value,
          boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel l;
        if(row==model.getRowCount()-2) {
        if (row == model.getRowCount() - 2) {
          int i = getSum(table.convertColumnIndexToModel(column));
          l = (JLabel)r.getTableCellRendererComponent(
                table, i, isSelected, hasFocus, row, 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);
        } else {
          l = (JLabel) r.getTableCellRendererComponent(
              table, value, isSelected, hasFocus, row, column);
          l.setBackground(Color.WHITE);
        }
        l.setForeground(Color.BLACK);
        return l;
      }
    });
  }
  return table;
}
}}

**解説 [#n25f3e6d]
上記のサンプルでは、以下のようにしてサマリー行を作成しています。
* 解説 [#explanation]
- モデル(`Integer`)の先頭と末尾にサマリーを表示する行を追加
-- 値は`Integer.MIN_VALUE`と`Integer.MAX_VALUE`を使用してソートしても先頭と末尾になるよう設定
- ソートで表示上の先頭になった行を`RowFilter`で非表示化

-モデルの先頭と末尾にダミー行を追加
--値は、``Integer.MIN_VALUE``と、``Integer.MAX_VALUE``でソートしても先頭か末尾にくるようにしておく
-ソートでどちらかが先頭行(表示上)になった場合、フィルターでこれを非表示にする
* 参考リンク [#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]

**参考リンク [#ve21225c]
-[http://www.jroller.com/santhosh/date/20070812 Sorting Table with Summary Row - Santhosh Kumar's Weblog]
-[http://forums.sun.com/thread.jspa?threadID=5377030 Swing - Sort rows in JTable except the last row]

**コメント [#gf3adf94]
* コメント [#comment]
#comment
#comment