TITLE:JTableにソートされないサマリー行を表示する

Posted by terai at 2009-04-27

JTableにソートされないサマリー行を表示する

JTableの行をソートしても、常に最終行にサマリーを表示します。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

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でソートしても先頭か末尾にくるようにしておく
  • ソートでどちらかが先頭行(表示上)になった場合、フィルターでこれを非表示にする

参考リンク

コメント