JDK-6315267 : javax.swing.JTable.setRowSorter(RowSorter) method doesn't clear selection in some cases
  • Type: Bug
  • Component: client-libs
  • Sub-Component: javax.swing
  • Affected Version: 6
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2005-08-24
  • Updated: 2012-03-23
  • Resolved: 2005-10-07
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6
6Resolved
Related Reports
Duplicate :  
Description
In specification is written:

public void setRowSorter(RowSorter sorter)

    Sets the RowSorter. RowSorter is used to provide sorting and filtering to a JTable.

    This method *clears the selection* and resets any variable row heights.

    If the underlying model of the RowSorter differs from that of this JTable undefined behavior will result.

    Parameters:
        sorter - the RowSorter; null turns sorting off

But when I run the folloving code:

import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableModel;
import javax.swing.JTable;
import javax.swing.RowSorter;
import java.util.Arrays;

public class Test1 {

	public static void main(String argv[]) {
		Test1 test = new Test1();
		test.setGetRowSorterTest();
	}

	private int[][] rowsToSelect =
			{
					{0, 2, 4},
					{0},
					{0, 1, 2, 3, 4},
					{3, 4}
			};

	private void selectRows(int[] rowsToSelect, JTable table) {
		table.setColumnSelectionAllowed(false);
		table.changeSelection(rowsToSelect[0], 0, false, false);
		for (int i = 1; i < rowsToSelect.length; i++) {
			table.changeSelection(rowsToSelect[i], 0, true, false);
		}
	}

	private void prinSelectedRows(JTable table, String ms) {
		System.out.println(ms + ": table.getSelectedRows() = " + Arrays.toString(table.getSelectedRows()));
	}

	public void setGetRowSorterTest() {
		TableModel model = new DefaultTableModel(5, 3);
		JTable table = new JTable(model);
		RowSorter[] rowSorters = {
				new TableRowSorter(model),
				null,
				new TableRowSorter(),
		};
		for (int i = 0; i < rowSorters.length; i++) {
			for (int[] selectedRows : rowsToSelect) {

				selectRows(selectedRows, table);
				System.out.println("rowsToSelect = " +
						Arrays.toString(selectedRows) +
						"; Sorter = " + rowSorters[i]);
				prinSelectedRows(table, "BEFORE");
				table.setRowSorter(rowSorters[i]);
				prinSelectedRows(table, "AFTER");
			}
		}
	}
}
-----------------------------
 I get the output:
-----------------------------
rowsToSelect = [0, 2, 4]; Sorter = javax.swing.table.TableRowSorter@901887
BEFORE: table.getSelectedRows() = [0, 2, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [0]; Sorter = javax.swing.table.TableRowSorter@901887
BEFORE: table.getSelectedRows() = [0]
AFTER: table.getSelectedRows() = []
rowsToSelect = [0, 1, 2, 3, 4]; Sorter = javax.swing.table.TableRowSorter@901887
BEFORE: table.getSelectedRows() = [0, 1, 2, 3, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [3, 4]; Sorter = javax.swing.table.TableRowSorter@901887
BEFORE: table.getSelectedRows() = [3, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [0, 2, 4]; Sorter = null
BEFORE: table.getSelectedRows() = [0, 2, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [0]; Sorter = null
BEFORE: table.getSelectedRows() = [0]
AFTER: table.getSelectedRows() = []
rowsToSelect = [0, 1, 2, 3, 4]; Sorter = null
BEFORE: table.getSelectedRows() = [0, 1, 2, 3, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [3, 4]; Sorter = null
BEFORE: table.getSelectedRows() = [3, 4]
AFTER: table.getSelectedRows() = [1, 2, 3, 4]
rowsToSelect = [0, 2, 4]; Sorter = javax.swing.table.TableRowSorter@3a6727
BEFORE: table.getSelectedRows() = [0, 2, 4]
AFTER: table.getSelectedRows() = []
rowsToSelect = [0]; Sorter = javax.swing.table.TableRowSorter@3a6727
BEFORE: table.getSelectedRows() = [0]
AFTER: table.getSelectedRows() = []
rowsToSelect = [0, 1, 2, 3, 4]; Sorter = javax.swing.table.TableRowSorter@3a6727
BEFORE: table.getSelectedRows() = [0, 1, 2, 3, 4]
AFTER: table.getSelectedRows() = []
rowsToSelect = [3, 4]; Sorter = javax.swing.table.TableRowSorter@3a6727
BEFORE: table.getSelectedRows() = [3, 4]
AFTER: table.getSelectedRows() = []
---------------------------------------------------------

So, in cases when RowSorter = null, new TableRowSorter(model) the selection is not cleared.

Comments
EVALUATION Verified with submitter this is no longer reproducible. This was fixed by 4976239, closing as a duplicate.
07-10-2005

EVALUATION I can't reproduce this, even with the first prompoted build that contained sorting. Moving to incomplete and contacting submitter.
30-08-2005