• category: swing folder: LocalDateFilter title: JTableにLocalDataのフィルタリングを実行するRowFilterを設定する tags: [JTable, RowFilter, TableRowSorter] author: aterai pubdate: 2020-09-07T19:23:43+09:00 description: JTableの列にLocalDataを追加したカレンダーを作成し、指定した期間でその日付をフィルタリングするRowFilterを設定します。 image: https://drive.google.com/uc?id=1eyfSFqFMOcxpCq2TfIRgKNkAKgei4BME

概要

JTableの列にLocalDataを追加したカレンダーを作成し、指定した期間でその日付をフィルタリングするRowFilterを設定します。

サンプルコード

public RowFilter<TableModel, Integer> makeRowFilter(String selected) {
  switch (selected) {
    case "within 3 days before":
      return new LocalDateFilter(realLocalDate.minusDays(3).plusDays(1), realLocalDate, 0);
    case "within 1 week before":
      return new LocalDateFilter(realLocalDate.minusWeeks(1).plusDays(1), realLocalDate, 0);
    case "1 week before and after":
      return new LocalDateFilter(realLocalDate.minusDays(3), realLocalDate.plusDays(3), 0);
    case "within 1 week after":
      return new LocalDateFilter(realLocalDate, realLocalDate.plusWeeks(1).minusDays(1), 0);
    default:
      return null;
  }
}

class LocalDateFilter extends RowFilter<TableModel, Integer> {
  private final LocalDate startDate;
  private final LocalDate endDate;
  private final int column;

  protected LocalDateFilter(LocalDate startDate, LocalDate endDate, int column) {
    super();
    this.startDate = startDate;
    this.endDate = endDate;
    this.column = column;
  }

  @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
    Object v = entry.getModel().getValueAt(entry.getIdentifier(), column);
    if (v instanceof LocalDate) {
      LocalDate date = (LocalDate) v;
      return !(startDate.isAfter(date) || endDate.isBefore(date));
    }
    return false;
  }
}
View in GitHub: Java, Kotlin

解説

  • 0列目にLocalDataを使用する月カレンダーをJTableで作成
  • 0列目がLocalDataの場合、指定した開始日と終了日の間に存在する日付だけ表示するRowFilterを作成してTableRowSorterに設定
       - `LocalData`ではなく`java.util.Date`を使用する場合は、デフォルトで用意されている[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/RowFilter.html#dateFilter-javax.swing.RowFilter.ComparisonType-java.util.Date-int...- RowFilter#dateFilter(RowFilter.ComparisonType, Date, int...)]が使用可能
  • フィルタリングのリセットにはTableRowSorter.setRowFilter(null)を使用

参考リンク

コメント