Se produit si au moins l'une des valeurs (valeurs == valeur dans RowFilter, valeur dans l'entrée) est une décimale. Voici un test défaillant:RowFilter.NumberFilter: impossible de gérer les types de nombres concrets "mixtes"
@Test
public void testRowFilterNumberMixCore() {
TestEntry entry = new TestEntry(1.2f);
RowFilter filter = RowFilter.numberFilter(ComparisonType.AFTER, 1, 0);
assertTrue(entry + "must be included " + filter, filter.include(entry));
}
La sortie est:
junit.framework.AssertionFailedError: [entry: 1.2] must be included [RowFilter: ComparisonType = AFTER, comparableValue: 1, comparableClass: class java.lang.Integer]
La raison est que NumberFilter revient à comparer les chiffres par leur number.longValue() si elles ne sont pas la même classe (et par rapport à l'autre)
Connaissant ce détail, l'échec du test n'est pas étonnant (à l'arrière-plan, n'aurait jamais pensé que ce soit un problème ;-) Un niveau de défense est de s'assurer - dans le client code - que les chiffres à comparer sont de la même classe. Ce n'est pas toujours possible (pensez f.i: un tableColumn avec columnClass Number) Donc je me demande si/comment améliorer le repli. Quelque chose comme:
if (one instanceof Comparable && one.getClass() == other.getClass()) {
// same class, use comparator
return ((Comparable) one).compareTo(other);
}
if (areIntegers(one, other)) {
// all integers, use longValue
return longCompare(one, other);
}
if (areDecimals(one, other)) {
// anything to do here?
}
// at last resort convert to BigDecimal and compare those:
BigDecimal bigOne = new BigDecimal(one.toString());
BigDecimal bigOther = new BigDecimal(other.toString());
return bigOne.compareTo(bigOther);
Ce faisant, fait passer de test - Je suis un peu méfiant au sujet cachés (lire: inconnu pour moi :) pièges. Tous les avertissements/alternatives sont les bienvenus!
Pour votre information: permuté à OTN's Swing forum
Suivi
mis en œuvre comme indiqué ci-dessus, en attendant maintenant pour les clients de se plaindre - dans ce cas, va pointer du doigt à tous ceux qui ne me prévenir ici :-)
Je peux voir ça ???? http://stackoverflow.com/questions/6187566/problem-formatting-fields-in-a-jtable-differences-between-integer-and-double ??? ou pas – mKorbel
@mKorbel - merci pour le lien. Cela semble un peu sans rapport, si je comprends bien cette question: le formateur aboie si la classe de colonne est différente de la classe garantie dans getColumnClass. Ce que je pense est à prévoir. Cela se résume ici à la comparaison des nombres, la table uniquement en arrière-plan (naturellement, l'un des domaines cibles évidents :-) – kleopatra