[RowSorter] Trier une colonne
Bonjour,
Je dois trier une colonne de manière un peu particulière.
En fait ma colonne contient des Strings, qui peuvent contenir du texte ou un entier converti en chaîne de caractères.
Lorsque je trie les éléments, si j'ai 2 entiers, je dois les comparer comme des entiers, dans tous les autres cas je dois comparer les 2 valeurs sous forme de String.
Pour cela j'ai créer un RowSorter que j'affecte à ma colonne :
Code:
1 2 3
| TableRowSorter<MonTableModel> sorter = new TableRowSorter<MonTableModel>((MonTableModel) maTable.getModel());
sorter.setComparator(2, new NumeroPositionComparator());
maTable.setRowSorter(sorter); |
Et voici le comparateur (qui fonctionne comme je le souhaite)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| private class NumeroPositionComparator implements Comparator<String> {
@Override
public int compare(String no1, String no2) {
Integer numero1 = null;
boolean isNo1Number = true;
Integer numero2 = null;
boolean isNo2Number = true;
try {
numero1 = Integer.valueOf(no1);
} catch (NumberFormatException e) {
LOG.error(e.getMessage(), e);
isNo1Number = false;
}
try {
numero2 = Integer.valueOf(no2);
} catch (NumberFormatException e) {
LOG.error(e.getMessage(), e);
isNo2Number = false;
}
if (isNo1Number && isNo2Number) {
return numero1.compareTo(numero2);
} else if (isNo1Number) {
return 1;
} else if (isNo2Number) {
return -1;
} else {
return no1.compareTo(no2);
}
}
} |
Le problème est que mes valeurs sont toujours triées en alphanumérique, à savoir :
10
110
120
20
30
310
40
....
Bien qu'en debug, je passe dans mon comparateur qui compare bien des entiers et non des strings.
Qqun a-t-il une idée de ce qu'il me manque ou de ce que je fais faux ?
Merci d'avance pour votre aide
Vu dans la javadoc de JXTable
Re,
J'ai eu le temps de m'y remettre et voici ce que je peux dire de plus Awane :
Citation:
Je me suis fais ce test :
Code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| import java.awt.BorderLayout;
import java.util.Comparator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;
public class TestTableSorter{
public static void main(String[] argv) {
Object nomsColonnes[] = { "Colonne 1"};
Object datas[][] = {
{ "10"},
{ "40"} ,
{ "adel"},
{ "awane"},
{ "120"},
{ "30"},
{ "110"},
{ "310"},
{ "20"}
};
DefaultTableModel model = new DefaultTableModel(datas, nomsColonnes);
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model);
sorter.setComparator(0, new NumeroPositionComparator());
final JTable table = new JTable(model);
table.setRowSorter(sorter);
final JFrame f = new JFrame();
f.setSize(300,300);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
f.setVisible(true);
}
});
}
}
class NumeroPositionComparator implements Comparator<String> {
@Override
public int compare(String no1, String no2) {
Integer numero1 = null;
boolean isNo1Number = true;
Integer numero2 = null;
boolean isNo2Number = true;
try {
numero1 = Integer.valueOf(no1);
} catch (NumberFormatException e) {
isNo1Number = false;
}
try {
numero2 = Integer.valueOf(no2);
} catch (NumberFormatException e) {
isNo2Number = false;
}
if (isNo1Number && isNo2Number) {
return numero1.compareTo(numero2);
} else if (isNo1Number) {
return 1;
} else if (isNo2Number) {
return -1;
} else {
return no1.compareTo(no2);
}
}
} |
et voilà le résultat après le tri :
adel
awane
10
20
30
40
110
120
310
Donc ton comparator fonctionne bien.
Effectivement ca marche bien si tu utilise un JTable.
Pour ma part, j'utilise une JXTable et là, ça ne fonctionne pas.
Doit-on en conclure qu'il s'agit d'un bug de JXTable ?
Merci pour vos retour
[EDIT] Ja'i vu ceci dans la javadoc de JXTable :
Citation:
NOTE: SwingX sorting/filtering is incompatible with core sorting/filtering in JDK 6+. Will be replaced by core functionality after switching the target jdk version from 5 to 6.
Mais je ne comprends pas bien le sens .... le tri est incompatible dans une version 6 ou plus du jdk ? Mais la suite veut dire que ce sera remplacé entre la version 5 et la 6 ?