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 :

[JTable] Trier selon une colonne contenant des Date


Sujet :

Composants Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut [JTable] Trier selon une colonne contenant des Date
    Bonjour tout le monde

    Comme dit dans le titre, j'aimerai trier un JTable selon les valeurs d'une colonne contenant des dates, dates qui seront au format "dd-mmm.", par exemple, "25-sep." pour le 25 septembre.
    Après des recherches je suis tombé sur deux liens, le premier (je ne sais pas si je peux le citer, il ne provient pas de ce site, et la dernière fois que j'ai cité un lien provenant d'un autre site d'entraide, mon message a été supprimé . . .) indiquait qu'il fallait surcharger la méthode "toString()", d'une classe héritant de "java.util.Date", classe que j'ai appelée PDate.
    J'ai donc dans le getValueAt(int row, int column) de mon Model une partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new PDate(arrayListDeDonnees.get(row).getDateA());
    avec comme constructeur dans PDate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public PDateJourMois(Date date){
    		super(date.getYear(), date.getMonth()-1, date.getDate());
    	}
    bien que le constructeur Date(int, int, int) soit "deprecated" (tout comme getYear/Month/Date() ), je ne sais pas du tout comment faire autrement
    Avec la fameuse méthode "toString()" (attention les yeux, ça pique un peu
    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
    public String toString(){
    		String res = this.getDate() + "-";
    		String mois;
    		switch (this.getMonth() + 1) {
    		case 1:
    		{
    			mois = "jan.";
    			break;
    		}
    		case 2:
    		{
    			mois = "fév.";
    			break;
    		}
    		case 3:
    		{
    			mois = "mars";
    			break;
    		}
    		case 4:
    		{
    			mois = "avr.";
    			break;
    		}
    		case 5:
    		{
    			mois = "mai";
    			break;
    		}
    		case 6:
    		{
    			mois = "juin";
    			break;
    		}
    		case 7:
    		{
    			mois = "jui.";
    			break;
    		}
    		case 8:
    		{
    			mois = "août";
    			break;
    		}
    		case 9:
    		{
    			mois = "sep.";
    			break;
    		}
    		case 10:
    		{
    			mois = "oct.";
    			break;
    		}
    		case 11:
    		{
    			mois = "nov.";
    			break;
    		}
    		case 12:
    		{
    			mois = "déc.";
    			break;
    		}
    		default:
    			mois = null;
    			break;
    		}
    		res = res + mois;
    		return res;
    	}
    Malgré que ça ne soit pas beau, et que ça soit "deprecated", ça a bien pour effet d'afficher ma date de la façon souhaitée.

    Tout ceci étant fait, j'ai appliqué ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tab = new JTable(new TabModel(alTest));//TabModel est une classe héritant de AbstractTableModel
     
    tab.setDefaultRenderer(String.class, new TabRenderer());//TabRenderer est une classe hériant de DefaultTableCellRenderer
    tab.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     
    TableRowSorter<TabModel> sorter = new TableRowSorter<TabModel>((TabModel)tab.getModel());//X
     
    tab.setRowSorter(sorter);//X
     
    this.add(new JScrollPane(tab), BorderLayout.CENTER);
     
    SortKey[] sks = new SortKey[]{new RowSorter.SortKey(1, SortOrder.ASCENDING)};//X
    tab.getRowSorter().setSortKeys(Arrays.asList(sks));//X
    Les lignes marquées "X" sont des lignes que j'ai copiées-collées, sans vraiment les comprendre je les ai prises ici ==> http://www.developpez.net/forums/d11...r.php?u=365317

    Et là, au moment de l'exécution du programme, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDate cannot be cast to java.lang.String
    à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.getRowSorter().setSortKeys(Arrays.asList(sks));
    Donc je comprends bien pourquoi il ne veut pas, car la date n'est pas considérée comme un String, mais comment faire pour que getRowSorter tienne compte de la date ? Il faut que je le surcharge ?

    PS :
    J'avais aussi simplement fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab.setAutoCreateRowSorter(true);
    tab.getRowSorter().toggleSortOrder(1);
    tab.setAutoCreateRowSorter(false);
    afin que le tableau apparaisse ordonné mais ça plantait avec la même erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDate cannot be cast to java.lang.String
    à la deuxième ligne.

    Donc voilà, un petit coup de main ne serait pas de refus

    Merci d'avance les gens !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Tu n'as pas la pile d'exception complète, je vois pas comment ça plante.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    premièrement pour les tris, par défaut le tri des colonnes utilises un comparateur de String, mais tu peux indiquer pour chaque colonne, donc au moins pour ta colonne contenant des PDate un comparateur spécifique par la méthode :

    setComparator(index,comparator) de TableRowSorter.

    Et tu implémentes un comparateur capable de comparer tes instances de PDateJourMois

    Ensuite pour l'affichage selon le format indiqué, tu peux utiliser un SimpleDateFormat pour simplifier, comme dans l'exemple suivant :

    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
    public class Test PDateJourMois {
     
     
    	public static void main(String[] args) {
     
    		 PDateJourMois date=new PDateJourMois(new Date());
     
    		System.out.println(date);
    	}
     
     
    }
    class PDateJourMois {
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
    	private Date date;
     
    	public PDateJourMois (Date date) {
    		this.date=date;
    	}
     
    	public Date getDate() {
    		return date;
    	}
     
    	public String toString() {
    		String month = FORMAT_MONTH.format(date);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(date) + month;
    	}
    }
    j'ai cru comprendre que tu voulais que ta classe PDateJourMois hérite de java.util.Date et que tu te posais la question par rapport au constructeur dépriécié. Tu peux écrire ça par exemple, pour ne pas utiliser le constructeur déprécié :

    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
    class PDate extends Date {
     
    	private static final long serialVersionUID = 1L;
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
     
    	public PDate(Date date) {
    		super(date.getTime());
    	}
     
     
    	public String toString() {
    		String month = FORMAT_MONTH.format(this);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(this) + month;
    	}
    }
    EDIT : j'ai oublié de dire que si ta classe PDateJourMois hérite de java.util.Date, plus besoin de faire ton comparateur spécifique, parce que TableRowSorter a un comparateur interne capable de traiter les comparable et que Date est un comparable.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    En ce qui concerne l'exception, tant qu'on a pas la stacktrace, on ne peut que supposer en effet.

    Mais il est fort probable que le problème vienne de la méthode getColumnClass(int) qui retourne String.class au lieu de PDateJourMois.class
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut YAOUH !
    Bin v'là des réponses plus que complète !!

    Je regarderai tout ça demain, merci beaucoup beaucoup beaucoup !

    Merci déjà en tout cas de vous être penché sur mon problème !

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    Bonjour !

    alors j'ai regardé un peu les réponses, fait des tests, mais ma classe PDateJourMois et ma classe PDate est la même, c'est juste que quand j'ai cherché à expliquer, j'ai modifié partout où il y avait écrit PDateJourMois et écrit à la place PDate, pour faire plus court Maintenant, j'écrirai uniquement PDateJourMois.

    Alors tout d'abord l'erreur complète :
    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
    	Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: variables.generales.PDateJourMois cannot be cast to java.lang.String
    	at java.text.Collator.compare(Unknown Source)
    	at javax.swing.DefaultRowSorter.compare(Unknown Source)
    	at javax.swing.DefaultRowSorter.access$100(Unknown Source)
    	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    	at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    	at java.util.Arrays.mergeSort(Unknown Source)
    	at java.util.Arrays.sort(Unknown Source)
    	at javax.swing.DefaultRowSorter.sort(Unknown Source)
    	at javax.swing.DefaultRowSorter.setSortKeys(Unknown Source)
    	at javax.swing.DefaultRowSorter.toggleSortOrder(Unknown Source)
    	at vues.composants.PnlListeAO.<init>(PnlListeAO.java:122)
    	at vues.JFramePrincipale.actionPerformed(JFramePrincipale.java:134)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.AbstractButton.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    	at java.awt.EventQueue.access$000(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.awt.EventQueue$1.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.awt.EventQueue$2.run(Unknown Source)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    Ensuite, pour ce qui est de ma classe PDateJourMois complète (modifiée, et qui fonctionne parfaitement) (merci beaucoup d'ailleurs, ça allège à mort ) :
    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
    	public class PDateJourMois extends Date implements Serializable{
     
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
     
    	public PDateJourMois(Date date){
    		super(date.getTime());
    	}
     
    	public String toString(){
    		String month = FORMAT_MONTH.format(this);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(this) + month;
    	}
    }
    J'ai donc essayé simplement avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.setAutoCreateRowSorter(true);
    puisque "Date est un comparable", puis dans le programme, j'ai double cliqué sur l'entête et là, PATATRAC ! La même exception

    Je dois alors forcément implémenter setComparator ?

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    le fait d'utiliser tab.setAutoCreateRowSorter(true) fait que la JTable va utiliser un DefaultRowSorter. Cette classe estime qu'il y a 2 façons de déterminer le comparateur à utiliser pour une colonne donnée : soit il est indiqué explicitement par setComparator, soit c'est un Collator, qui tri des String. Donc si aucun comparator n'est indiqué pour ta colonne PDateJourMois, la comparaison utilisant un comprator, cherche à caster la valeur de la colonne triée en String, et ça plante, puisque c'est pas du String.

    Donc soit tu initialises ta table avec un TableRowSorter qui "sait" comparer du Comparable, soit tu utilises setAutoCreateRowSorter(true) et tu dois indiquer le comparateur spécifique à utiliser pour tes colonnes qui ne sont pas du type String.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    Donc soit tu initialises ta table avec un TableRowSorter qui "sait" comparer du Comparable, soit tu utilises setAutoCreateRowSorter(true) et tu dois indiquer le comparateur spécifique à utiliser pour tes colonnes qui ne sont pas du type String.
    Quel solution tu penses que je devrais utiliser ?


    J'ai testé un... une chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TableRowSorter<TabModel> sorter = new TableRowSorter<TabModel>((TabModel)tab.getModel());
    sorter.setComparator(1, Comparator<?>);
     
    tab.setRowSorter(sorter);
    Mais à l'endroit du "?" je ne sais pas du tout quoi mettre ! J'ai regardé ici (le lien que tu m'avais donné) mais aussi ici et je ne comprends pas comment utiliser tout ça j'ai essayé avec "Date.class", pour lui dire que dans "sorter.setComparator(1, Comparator<Date.class>)" :
    sorter ==> ce qui permet de "ranger" une table
    setComparator ==> on créer un nouveau comparateur
    1 ==> sur la colonne 1 (enfin la deuxième, mais vu que ça commence à 0...)
    Comparator<Date.class> ==> en utilisant le comparateur propre aux dates

    C'est comme ça que je crois avoir compris qu'il fallait l'utiliser, mais étant donné que ça ne marche pas, je pense que je dois faire fausse route...

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Le type du second paramètre de la méthode setComparator(1, Comparator<?>) de TableRowSorter est juste un Comparator de n'importe quoi, parce qu'évidemment une colonne peut contenir n'importe quel type à priori.

    Mais toi tu sais ce que ta colonne contient : des instances de PDateJourMois, qui étend java.util.Date, qui implémente java.lang.Comparable, à priori.

    1) premièrement, regardons le code source de la méthode qui permet au TableRowSorter de déterminer le Comparator à utiliser pour une colonne donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public Comparator<?> getComparator(int column) {
            Comparator comparator = super.getComparator(column);
            if (comparator != null) {
                return comparator;
            }
            Class columnClass = getModel().getColumnClass(column);
            if (columnClass == String.class) {
                return Collator.getInstance();
            }
            if (Comparable.class.isAssignableFrom(columnClass)) {
                return COMPARABLE_COMPARATOR;
            }
            return Collator.getInstance();
        }
    Le super.getComparator(column) retourne le comparateur indiqué par la méthode setComparator().
    S'il n'y en a pas, si la classe de la colonne (indiquée par la méthode getColumnClass() du modèle) est String, alors on prend une instance de Collator (un Comparateur de String gérant la locale et ne triant donc pas simplement sur l'ordre ascii des caractères),
    et sinon, si le type implémente Comparable, on utilise un comparateur de Comparable,
    et enfin, si aucun comparateur n'a pu être déterminé à la fin, on utilisera un Collator.

    Donc, comme je le disais, le fait d'utiliser une instance de TableRowSorter ne nécessite pas d'appeler setComparator() pour ta colonne de classe PDateJourMois si cette classe étend java.util.Date.

    Mais tu peux le faire si ça te chante ; et tu dois le faire si PDateJourMois n'implémente pas java.lang.Comparable ou n'étends pas une classe qui implémente cette interface, directement ou par héritage.

    Donc tu peux passer en second argument de setComparator une instance de Comparator<PDateJourMois> par exemple.

    Par exemple, avec l'exemple de code pour cette classe que j'avais posté précédemment (qui n'étendais pas Date), donc pour rappel :
    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
    class PDateJourMois {
    	private final static SimpleDateFormat FORMAT_DATE = new SimpleDateFormat("dd-");
    	private final static SimpleDateFormat FORMAT_MONTH = new SimpleDateFormat("MMM");
    	private Date date;
     
    	public PDateJourMois (Date date) {
    		this.date=date;
    	}
     
    	public Date getDate() {
    		return date;
    	}
     
    	public String toString() {
    		String month = FORMAT_MONTH.format(date);
    		if ( month.length()>4 ) month=month.substring(0,3)+"."; 
    		return FORMAT_DATE.format(date) + month;
    	}
    }
    tu peux écrire tout simplement, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rowsoter.setComparator(1/* si c'est bien là l'index de ta colonne*/,
    new Comparator<PDateJourMois>() {
     
    			@Override
    			public int compare(PDateJourMois o1, PDateJourMois o2) {
    				return o1.getDate().compareTo(o2.getDate());
    			}
    		});
    Pour terminer, au sujet de :

    Citation Envoyé par Nafnlaus Voir le message
    j'ai essayé avec "Date.class", pour lui dire que dans "sorter.setComparator(1, Comparator<Date.class>)" :
    Les noms de classes en java, que cela soit pour déclarer une variable, un argument de méthode, étendre ou toute autre référence à une classe, donc y compris pour les types paramétrés ou génériques, on utilise le nom de la classe, donc pas besoin d'extension .class qui se rapporte plutôt au fichier décrivant la classe.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut Soit béni...
    Ça marche parfaitement !!

    Merci beaucoup !!

    Eventuellement, tu saurais comment faire pour une fois cette partie exécutée :
    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
    		tab = new JTable(new TabModel(alTest));
    		TableRowSorter<TabModel> sorter = new TableRowSorter<TabModel>((TabModel)tab.getModel());
    		sorter.setComparator(1,
    				new Comparator<PDateJourMois>() {
    							@Override
    							public int compare(PDateJourMois o1, PDateJourMois o2) {
    								return o1.getDate().compareTo(o2.getDate());
    							}
    						});
     
    		tab.setRowSorter(sorter);
     
    		this.add(new JScrollPane(tab), BorderLayout.CENTER);
     
    		tab.getRowSorter().toggleSortOrder(1);
    Donc là, il le range automatiquement selon la première colonne au lancement, mais j'aimerai empêcher l'utilisateur de double cliquer sur les en-têtes. J'ai donc essayé un pitit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab.setRowSorter(null);
    à la fin, pour "empêcher" l'effet de l'ancien sorter, mais ça l'annule juste totalement

    Un avis/conseil ?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    en théorie si on veut trier les données d'une JTable sans avoir un système interactif, on tri les données à la source, ou éventuellement dans le modèle, pas avec un rowSorter.

    Tu peux invoquer setSortable(columnIndex,false) pour désactiver l'interaction, mais le signe de tri (le triangle noir dans l'entête) sera affiché.

    Pour trier les données dans le modèle, tu peux procéder "à l'ancienne", on créant un modèle triant englobant le modèle de ta table. Tu peux trouver un exemple ici.

    Il tes suffit d'y modifier la méthode protected int compare(int i, int j) pour trier selon ton besoin.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    Ah bin oui c'est vrai, autant le faire dans le modèle...
    En tout cas, tout ce que tu m'as appris, c'est pas perdu !
    Merci beaucoup pour le lien
    Je vais me pencher là-dessus..

    Je vais passer le sujet en mais juste une dernière question en plus, si tu veux bien, comme t'as l'air de maîtriser la chose je souhaite juste un avis, pas forcément du code direct hein

    En fait ce tableau sert à afficher des données, que j'appellerai "Affaire", qui ont chacune un numéro unique. Au clic sur ces Affaires, un JDialog (sauvage) apparaît. Et il faudrait que ces Affaires, soit séparées par une ligne indiquant "Semaine du ... au ...", donc je sais comment savoir si une date et une autre font partie du même numéro de semaine, mais par contre, c'est pour l'affichage que j'hésite.

    Je pensais dans le modèle, ajouter une nouvelle ligne à chaque fois, indiquant la semaine, mais comme elle serait dans la colonne "Numéro" et que ce numéro ne sera jamais très "long" (au sens longueur, en pixels), soit le texte sera partiellement manquant, soit la colonne sera hyper large. J'ai donc cherché à fusionner des cellules, mais j'ai pas trouvé grand chose... Dans ce cas, les data du model sont sous la forme "ArrayList<Affaire>".

    Sinon, étant donné que le JTable est dans un JScrollPane, je pensais afficher une nouvelle JTable, sans en-têtes, à chaque nouvelle semaine, avec simplement un JLabel entre chaque. Ce qui aurait donné :
    En-têtes
    JTable
    JLabel
    JTable
    JLabel
    .
    .
    .
    Mais je ne sais pas comment va se comporter la barre du JScrollPane
    Pour les écouteurs, pas de prob', le même pour tous les JTable, on récupère le numéro d'affaire, on affiche ce qu'on veut. Pour les data, soit comme avant, soit "ArrayList<AffParSemaine>" avec AffParSemaine (dans l'idée, juste vite fait) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class AffParSemaine{
    	int numSemaine;
    	ArrayList<Affaire> alAff;
    }
    Donc voilà, qu'est-ce que tu en penses ? Aurais-tu une autre idée ?

    En tout cas, déjà, pour tout, vraiment

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Ce qu'il te faudrait c'est la GroupTable de JIDE, mais c'est payant JIDE. Si tu réalises une application dans un cadre professionnel, ou que tu veux par la suite vendre, c'est un investissement valable que tu peux rentabiliser assez vite, mais si c'est pour une appli perso, c'est différent.

    Je ne sais s'il existe de version gratuite d'un équivalent. C'est probablement faisable, soit en partant des JTree, ou en mettant des JTable dans des Jtables peut être, il faudrait que je réfléchisse et je fasses quelques tests d'implémentation pour imaginer la meilleur solution. En tout cas c'est pas mal de boulot.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 46
    Points : 41
    Points
    41
    Par défaut
    Okok, je vais voir tout ça, je ferai des tests, peut-être du côté des JTable, dans des JTable... Je vais voir tout ça

    Merci encore pour tout !!

    En espérant te recroiser sur ce forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Graphics View] Ajouter une colonne contenant des images dans un QTableView
    Par vikki dans le forum Qt
    Réponses: 8
    Dernier message: 14/09/2010, 14h00
  2. Trier selon une colonne et à partir de la 3eme ligne
    Par manu f dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/07/2010, 20h18
  3. Trier selon une colonne masquée
    Par michaeljeru dans le forum jQuery
    Réponses: 1
    Dernier message: 16/05/2010, 01h01
  4. 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
  5. [debutant][JTable] Trier selon une colonne
    Par yupa dans le forum Composants
    Réponses: 3
    Dernier message: 08/08/2005, 11h05

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