STEP3:選択したセルの編集

STEP3:選択したセルの編集

STEP2まででセルの編集はできるようになりましたが、一番左のカラムで行を選択して、その後セルを選択するといった仕様になっているため操作性が悪いです。そこでSTEP3では、セルの選択で直接編集できるようにします。

セル選択による編集の切り替えを行うためには、テーブル上でのマウスイベントからクリックされたセルを特定し、editElement()メソッドで編集モードをオンにするといったマウスアダプタが必要になります。

⁄**
 * TableViewerのセル選択時の処理を行うクラス
 *⁄
class TestResultTableMouseAdapter extends MouseAdapter {

   private TableViewer viewer_;

   public TestResultTableMouseAdapter(TableViewer viewer){
      viewer_ = viewer;
   }

   ⁄**
    * マウスクリック時の処理
    *
    * クリックされたセルを特定し、編集モードに切り替える
    *⁄
   public void mouseDown(MouseEvent e) {
     int x = e.x;
     int y = e.y;
     Table messageTable = (Table)e.getSource();

     ⁄⁄ クリックされたポイントからテーブルアイテムを取得
     Point clickPoint = new Point(x, y);

     Table table = viewer_.getTable();
     int startRowNum = table.getTopIndex();
     int endRowNum = table.getItemCount();
     int columnCount = table.getColumnCount();

     TableItem targetItem = null;
     int columnIndex = 0;
     ⁄⁄ 行でループ
     for (int rowCnt = startRowNum; rowCnt endRowNum; rowCnt++) {
         TableItem item = table.getItem( rowCnt);
         ⁄⁄ 列でループ
         for (int j = 0; j = columnCount; j++) {
             Rectangle rect = item.getBounds(j);
             ⁄⁄ クリックされたセルを特定する
             if (rect.contains(clickPoint)) {
                 columnIndex = j;
                 targetItem = item;
                 break;
             }
         }
     }

     ⁄⁄ 編集モードをオンにする
     if (targetItem != null) {
         int rowIndex = messageTable.indexOf(targetItem);
         viewer_.editElement(targetItem.getData(), columnIndex);
     }
  }
}

マウスアダプタが完成したら、テーブルのリスナーとして登録します。
 

⁄⁄ マウスアダプタの設定
testResultTable.addMouseListener(new TestResultTableMouseAdapter(testResultViewer));

以上で、セル選択による編集の切り替えができるようになります。
 

STEP3のソースコード
Text  step3.zip
  (ZIPファイル/5.12KB)

STEP4:ソート

次に、カラムヘッダの選択によるデータのソート機能を追加します。

テーブルでソート機能を実現するには、ViewerSorterを継承して並び替えのルールを実装します。


 

package table_viewer;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;

⁄**
 * MessageTableSorter
 *
 * テーブルのソート処理を行うクラス
 *⁄
public class TestResultSorter extends ViewerSorter {
   ⁄⁄ 並び替えのタイプ
   public static final int SORT_TYPE_UP = 1;
   public static final int SORT_TYPE_DOWN = 2;

   ⁄⁄ 並び替え対象を識別するキー
   public static final int SORT_BY_ID = 0;
   public static final int SORT_BY_NAME = 1;
   public static final int SORT_BY_ENGLISH_SCORE = 2;
   public static final int SORT_BY_MATHEMATICS_SCORE = 3;
   public static final int SORT_BY_JAPANESE_SCORE = 4;
   public static final int SORT_BY_EVALUATION = 5;

   public int sortType_ = SORT_TYPE_UP;

   public int sortKey_ = SORT_BY_ID;

   ⁄**
    * 並び替えタイプ(昇順or降順)の設定
    *⁄
   public void setSortType(int sortType) {
     sortType_ = sortType;
   }

   ⁄**
     * 並び替えタイプの取得
     *⁄
   public int getSortType() {
     return sortType_;
   }

   ⁄**
    * 並び替え対象列の設定
    *⁄
   public void setColumnIndex(int sortKey) {
     sortKey_ = sortKey;
   }

   ⁄**
    * 並び替えルール
    *⁄
   public int compare(Viewer viewer, Object e1, Object e2) {
      TestResult result1 = (TestResult)e1;
      TestResult result2 = (TestResult)e2;

      ⁄⁄ ソートのキーごとに処理を分岐
      if (sortKey_ == SORT_BY_ID) {
          Integer id1 = new Integer(result1.getId());
          Integer id2 = new Integer(result2.getId());

          if (sortType_ == SORT_TYPE_UP) {
              return id1.compareTo(id2);
          } else {
              return id1.compareTo(id2) * -1;
          }
      } else if (sortKey_ == SORT_BY_NAME) {
          if (sortType_ == SORT_TYPE_UP) {
              return result1.getName().compareTo(result2.getName());
          } else {
              return result1.getName().compareTo(result2.getName()) * -1;
          }
      } else if (sortKey_ == SORT_BY_ENGLISH_SCORE) {
          Integer englishScore1 = new Integer(result1.getEnglishScore());
          Integer englishScore2 = new Integer(result2.getEnglishScore());

          if (sortType_ == SORT_TYPE_UP) {

              return englishScore1.compareTo(englishScore2);

          } else {
              return englishScore1.compareTo(englishScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_MATHEMATICS_SCORE) {
          Integer mathScore1 = new Integer(result1.getMathematicsScore());
          Integer mathScore2 = new Integer(result2.getMathematicsScore());

          if (sortType_ == SORT_TYPE_UP) {
              return mathScore1.compareTo(mathScore2);
          } else {
              return mathScore1.compareTo(mathScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_JAPANESE_SCORE) {
          Integer japaneseScore1 = new Integer(result1.getJapaneseScore());
          Integer japaneseScore2 = new Integer(result2.getJapaneseScore());

          if (sortType_ == SORT_TYPE_UP) {
              return japaneseScore1.compareTo(japaneseScore2);
          } else {
              return japaneseScore1.compareTo(japaneseScore2) * -1;
          }
      } else if (sortKey_ == SORT_BY_EVALUATION) {
          String evaluation1 = result1.getEvaluation();
          String evaluation2 = result2.getEvaluation();
          if (sortType_ == SORT_TYPE_UP) {
              return evaluation1.compareTo(evaluation2);
          } else {
              return evaluation1.compareTo(evaluation2) * -1;
          }
      }
      return 0;
   }
}

テーブルビューアに対して作成したソータを設定します。
 

⁄⁄ テーブルソータの設定
testResultViewer.setSorter(new TestResultSorter());

以上で、ソータの設定は完了です。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30