-
Bug
-
Resolution: Not an Issue
-
P3
-
None
-
6
-
generic
-
windows_xp
While using Comparator in DefaultRowSorter I've faced with a problem : if I sort in the SortOrder.ASCENDING order and in the SortOrder.DESCENDING order I get the following output:
================================
ASCENDING
row index in terms of Model: 0; in view: = 0
row index in terms of Model: 1; in view: = 4
row index in terms of Model: 2; in view: = 3
row index in terms of Model: 3; in view: = 2
row index in terms of Model: 4; in view: = 1
DESCENDING
row index in terms of Model: 0; in view: = *4*
row index in terms of Model: 1; in view: = *0*
row index in terms of Model: 2; in view: = *1*
row index in terms of Model: 3; in view: = *2*
row index in terms of Model: 4; in view: = *3*
==================================
But I've expected :
===================================
ASCENDING
row index in terms of Model: 0; in view: = 0
row index in terms of Model: 1; in view: = 4
row index in terms of Model: 2; in view: = 3
row index in terms of Model: 3; in view: = 2
row index in terms of Model: 4; in view: = 1
DESCENDING
row index in terms of Model: 0; in view: = *1*
row index in terms of Model: 1; in view: = *2*
row index in terms of Model: 2; in view: = *3*
row index in terms of Model: 3; in view: = *4*
row index in terms of Model: 4; in view: = *0*
==================================
To reproduce it, invoke the following code:
//-------------------------------------------------------------------------
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
public class TestComparator {
class ZeroComparator implements Comparator<Integer> {
public int compare(Integer i1, Integer i2) {
if (i1 == 0) i1 = 100;
if (i2 == 0) i2 = 100;
return i2 - i1;
}
}
private TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return 5;
}
public Object getValueAt(int row, int col) {
return row * col;
}
};
private DefaultRowSorter rs = new TableRowSorter(dataModel);
private List<RowSorter.SortKey> keys = new LinkedList<RowSorter.SortKey>();
public void test() {
rs.setComparator(1, new ZeroComparator());
System.out.println("ASCENDING");
keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
rs.setSortKeys(keys);
printRowNumbers();
System.out.println("DESCENDING");
keys.clear();
keys.add(new RowSorter.SortKey(1, SortOrder.DESCENDING));
rs.setSortKeys(keys);
printRowNumbers();
}
private void printRowNumbers() {
for (int i = 0; i < dataModel.getRowCount(); i++) {
System.out.println("row in Model: " + i +
"; in view: = " + rs.convertRowIndexToView(i));
}
}
public static void main(String[] args) {
TestComparator tc= new TestComparator();
tc.test();
}
}
//--------------------------------------------------------------------------
Such behaviour seems to be strange. Could you, please, explain if I wrong.
###@###.### 2005-07-21 15:26:54 GMT
================================
ASCENDING
row index in terms of Model: 0; in view: = 0
row index in terms of Model: 1; in view: = 4
row index in terms of Model: 2; in view: = 3
row index in terms of Model: 3; in view: = 2
row index in terms of Model: 4; in view: = 1
DESCENDING
row index in terms of Model: 0; in view: = *4*
row index in terms of Model: 1; in view: = *0*
row index in terms of Model: 2; in view: = *1*
row index in terms of Model: 3; in view: = *2*
row index in terms of Model: 4; in view: = *3*
==================================
But I've expected :
===================================
ASCENDING
row index in terms of Model: 0; in view: = 0
row index in terms of Model: 1; in view: = 4
row index in terms of Model: 2; in view: = 3
row index in terms of Model: 3; in view: = 2
row index in terms of Model: 4; in view: = 1
DESCENDING
row index in terms of Model: 0; in view: = *1*
row index in terms of Model: 1; in view: = *2*
row index in terms of Model: 2; in view: = *3*
row index in terms of Model: 3; in view: = *4*
row index in terms of Model: 4; in view: = *0*
==================================
To reproduce it, invoke the following code:
//-------------------------------------------------------------------------
import javax.swing.table.TableRowSorter;
import javax.swing.table.TableModel;
import javax.swing.table.AbstractTableModel;
import javax.swing.*;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
public class TestComparator {
class ZeroComparator implements Comparator<Integer> {
public int compare(Integer i1, Integer i2) {
if (i1 == 0) i1 = 100;
if (i2 == 0) i2 = 100;
return i2 - i1;
}
}
private TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return 5;
}
public Object getValueAt(int row, int col) {
return row * col;
}
};
private DefaultRowSorter rs = new TableRowSorter(dataModel);
private List<RowSorter.SortKey> keys = new LinkedList<RowSorter.SortKey>();
public void test() {
rs.setComparator(1, new ZeroComparator());
System.out.println("ASCENDING");
keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
rs.setSortKeys(keys);
printRowNumbers();
System.out.println("DESCENDING");
keys.clear();
keys.add(new RowSorter.SortKey(1, SortOrder.DESCENDING));
rs.setSortKeys(keys);
printRowNumbers();
}
private void printRowNumbers() {
for (int i = 0; i < dataModel.getRowCount(); i++) {
System.out.println("row in Model: " + i +
"; in view: = " + rs.convertRowIndexToView(i));
}
}
public static void main(String[] args) {
TestComparator tc= new TestComparator();
tc.test();
}
}
//--------------------------------------------------------------------------
Such behaviour seems to be strange. Could you, please, explain if I wrong.
###@###.### 2005-07-21 15:26:54 GMT