概要

JDK 6で導入されたTableRowSorterでの行ソートを、テーブルヘッダのShift+クリックでクリアします。

サンプルコード

table.setAutoCreateRowSorter(true);
table.getTableHeader().addMouseListener(new MouseAdapter() {
  @Override public void mouseClicked(MouseEvent e) {
    final RowSorter<? extends TableModel> sorter = table.getRowSorter();
    if (sorter == null || sorter.getSortKeys().isEmpty()) {
      return;
    }
    JTableHeader h = (JTableHeader) e.getComponent();
    TableColumnModel columnModel = h.getColumnModel();
    int viewColumn = columnModel.getColumnIndexAtX(e.getX());
    if (viewColumn < 0) {
      return;
    }
    int column = columnModel.getColumn(viewColumn).getModelIndex();
    if (column != -1 && e.isShiftDown()) {
      EventQueue.invokeLater(new Runnable() {
        @Override public void run() {
          sorter.setSortKeys(null);
        }
      });
    }
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、TableHeaderShiftキーを押しながらマウスクリックしたときにTableRowSorter#setSortKeysメソッドを使ってソートキーを空にすることでソート無しの状態に戻す機能を追加しています。

  • ソートキーになっていないカラムヘッダをShift+クリックした場合でもソート状態をクリアしてしまう
  • ドラッグ&ドロップでの入れ替えは無効化する必要がある

参考リンク

コメント