IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[RowSorter] Trier une colonne


Sujet :

Composants Java

  1. #1
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Hello doons,

    Citation Envoyé par doons Voir le message
    Qqun a-t-il une idée de ce qu'il me manque ou de ce que je fais faux ?
    Ton code me parrait correct
    Je l'ai repris avec un tablemodel contenant ces valeurs :
    10
    40
    adel
    awane
    120
    30
    110
    310
    20

    Je me suis fais ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    79
     
    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.

    Je pense que c'est dans MonTableModel ou tu dois regarder il faut définir la bonne classe, Peut être dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     @Override
        public Class<?> getColumnClass(int columnIndex)

    Awane
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  3. #3
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut
    Hello,

    Oui effectivement en sortant le code dans un petit exemple ça marche bien.
    Je retourne bien une string dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Class<?> getColumnClass(int columnIndex)
    Je vais me pencher de nouveau sur le problème en espérant pouvoir sortir une réponse.
    Déjà merci pour ta réponse

  4. #4
    Membre actif
    Profil pro
    100
    Inscrit en
    Juillet 2007
    Messages
    585
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : 100

    Informations forums :
    Inscription : Juillet 2007
    Messages : 585
    Points : 270
    Points
    270
    Par défaut 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 :

    Je me suis fais ce test :

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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 ?

Discussions similaires

  1. Trier une colonne par date
    Par foobar42 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2006, 17h46
  2. Trier une colonne
    Par tets88 dans le forum Access
    Réponses: 1
    Dernier message: 02/05/2006, 08h59
  3. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  4. Réponses: 5
    Dernier message: 15/11/2005, 12h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo