• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableをソートした後の選択状態
#navi(../)
*JTableをソートした後の選択状態 [#ke69df21]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2008-03-24~
更新日:&lastmod;
---
category: swing
folder: UpdateSelectionOnSort
title: JTableをソートした後の選択状態
tags: [JTable, TableRowSorter, JTableHeader, MouseListener]
author: aterai
pubdate: 2008-03-24T14:15:18+09:00
description: JDK 1.6で導入されたRowSorterを使って、JTableをソートした場合、直前の選択状態がどう変化するかテストします。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTWaXC_E3I/AAAAAAAAApM/H9h2pJw-VSQ/s800/UpdateSelectionOnSort.png
---
* 概要 [#summary]
`JDK 1.6`で導入された`RowSorter`を使って、`JTable`をソートした場合、直前の選択状態がどう変化するかテストします。

#contents
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTWaXC_E3I/AAAAAAAAApM/H9h2pJw-VSQ/s800/UpdateSelectionOnSort.png)

**概要 [#g9471dc9]
JDK 1.6 で導入された RowSorter を使って、JTableをソートした場合、直前の選択状態がどう変化するかテストします。

#screenshot

**サンプルコード [#rfe93d8e]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
table.setUpdateSelectionOnSort(true);
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#ib5c8542]
ソート後の、選択状態は、JTable#setUpdateSelectionOnSort メソッドで切り替えることが出来ます。

- setUpdateSelectionOnSort(true)
-- ソート前と、「同じ内容の列」が選択された状態になる
-- デフォルト
- setUpdateSelectionOnSort(false)
-- ソート前と、「表示上同じ列」が選択された状態になる

----
JDK 1.5 などで、TableSorter.java を使用したときと同じように、ソート後は選択状態をクリアする場合は、以下のようにJTableHeader に MouseListener を追加して、table.clearSelection() する方法などがあります。
* 解説 [#explanation]
- `UpdateSelectionOnSort`
-- ソート後の選択状態は`JTable#setUpdateSelectionOnSort(boolean)`メソッドで切り替えることが可能
-- `setUpdateSelectionOnSort(true)`
--- ソート前と「同じ内容の行」が選択された状態になる(デフォルト)
-- `setUpdateSelectionOnSort(false)`
--- ソート前と「表示上同じ行」が選択された状態になる
- `ClearSelectionOnSort`
-- ソート後に選択状態をクリアする場合は`TableRowSorter#toggleSortOrder(int)`をオーバーライドしたり、以下のように`JTableHeader`に`MouseListener`を追加して`table.clearSelection()`を実行する必要がある
-- チェックなし
--- 選択状態を維持(デフォルト)
-- チェックあり
--- ソート後は選択状態をクリア
--- `JDK 1.5`などで`TableSorter.java`を使用した場合の動作と同じになるように設定する
#code{{
table.getTableHeader().addMouseListener(new MouseAdapter() {
  @Override 
  public void mouseClicked(MouseEvent e) { //mousePressed(MouseEvent e) {
    if(table.isEditing()) table.getCellEditor().stopCellEditing();
  @Override public void mouseClicked(MouseEvent e) {
    if (table.isEditing()) {
      table.getCellEditor().stopCellEditing();
    }
    table.clearSelection();
  }
});
}}

//**参考リンク
**コメント [#o297f6ce]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTable.html#setUpdateSelectionOnSort-boolean- JTable#setUpdateSelectionOnSort(boolean) (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment