« 初回実施月日の自動入力 | トップページ | Mac の JPopupMenu の不具合の回避(2) »

2011年2月20日 (日)

年齢ソート

Agesort

TableRowSorter に Comparator を設定して,年齢・生年月日で正しくソートできるようにした。

plugin/PatientSearchImpl.java

private void initComponents() {
 ・
 ・
  TableRowSorter sorter = new TableRowSorter(tableModel) {
    // ASCENDING -> DESENDING -> 初期状態 と切り替える
    @Override
    public void toggleSortOrder(int column) {
      if(column >= 0 && column < getModelWrapper().getColumnCount() && isSortable(column)) {
         List keys = new ArrayList(getSortKeys());
         if(!keys.isEmpty()) {
           SortKey sortKey = keys.get(0);
           if(sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) {
             setSortKeys(null);
             return;
           }
         }
      }
      super.toggleSortOrder(column);
    }
  };
  // 生年月日コラムに comparator を設定「32.10 歳(S60-01-01)」というのをソートできるようにする
  sorter.setComparator(AGE_COLUMN, new Comparator(){
    @Override
    public int compare(Object o1, Object o2) {
      String birthday1;
      String birthday2;
      if (ageDisplay) {
         birthday1 = ModelUtils.getMmlBirthdayFromAge((String)o1);
         birthday2 = ModelUtils.getMmlBirthdayFromAge((String)o2);
         return birthday2.compareTo(birthday1);
      } else {
         birthday1 = (String)o1;
         birthday2 = (String)o2;
         return birthday1.compareTo(birthday2);
      }
    }
  });
  table.setRowSorter(sorter);

util/ModelUtils.java

/**
 * 年齢付きの生年月日「32.10 歳 (S50-01-01)」形式から mmlBirthday を返す
 * @param birthdayWithAge
 * @return
 */
public static String getMmlBirthdayFromAge(String birthdayWithAge) {
 String[] s = birthdayWithAge.split("[()]");
 return toSeireki(s[1]);
}

« 初回実施月日の自動入力 | トップページ | Mac の JPopupMenu の不具合の回避(2) »

OpenDolphin」カテゴリの記事