2011-06-03 4 views
2

Lorsque vous cliquez sur l'en-tête de la colonne sur mon JTable, il trie les lignes par ordre alphabétique. Cela fonctionne pour toutes mes colonnes sauf une. Dans cette colonne, les valeurs sont toutes des chaînes, mais contiennent des nombres. J'ai besoin qu'ils soient triés en fonction de leur valeur décimale et non de la valeur de chaîne.Tri des lignes par colonnes dans JTable

Une idée de comment accomplir ceci?

+0

par « contiennent des nombres » voulez-vous dire une chaîne comme " 50 pommes "ou juste un nombre comme" 50 "avec le type de chaîne? – Tim

+0

Les deux réponses se réfèrent correctement à 'getColumnClass()'. Voir aussi [Littéraux de classe en tant que jetons de type exécution] (http://download.oracle.com/javase/tutorial/extra/generics/literals.html). – trashgod

Répondre

4

Le trieur de lignes par défaut triera en fonction de la classe de colonne. Si la classe de colonne est Object (valeur par défaut), elle utilise la méthode toString(). Si vous pouvez changer ce que vous mettez dans la colonne en quelque chose qui implémente l'interface Comparable (par exemple Integer/Double), il utilisera ce comparateur à la place. Vous devrez également modifier la classe de colonnes sur le modèle de table. Pour ce faire, vous devrez étendre DefaultTableModel (ou implémenter AbstractTableModel ou TableModel) et remplacer la méthode getColumnClass().

Si vous ne pouvez pas modifier les données qui vont dans la colonne (pour une raison quelconque, vous voulez stocker des chaînes), alors vous devrez modifier le RowSorter pour la table.

DefaultRowSorter rowSorter = new DefaultRowSorter(); 
rowSorter.setComparator(numberColumnIndex,numberSortingComparator); 
table.setRowSorter(rowSorter); 
8

s'il vous plaît lire tutoriel sur JTable qui est contient par exemple TableRowSorter,

votre réponse est ces codes lignes, colonne de classe correctement

public Class getColumnClass(int c) { 
    return getValueAt(0, c).getClass(); 
} 

// or could be in most cases hardcoded, and I'm using that too 

      @Override 
      public Class<?> getColumnClass(int colNum) { 
       switch (colNum) { 
        case 0: 
         return Integer.class; 
        case 1: 
         return Double.class; 
        case 2: 
         return Long.class; 
        case 3: 
         return Boolean.class; 
        case 4: 
         return String.class; 
        case 5: 
         return Icon.class; 
        /*case 6: 
        return Double.class; 
        case 7: 
        return Double.class; 
        case 8: 
        return Double.class;*/ 
        default: 
         return String.class; 
       } 
      } 
mis
+0

+1, la solution appropriée consiste à stocker les nombres en tant qu'objets Double et non en tant qu'objets String. Non seulement ils seront triés correctement, mais la volonté sera rendue proprement ainsi avec une juste justification. – camickr

Questions connexes