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 :

Trier un JTable sur une date


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut Trier un JTable sur une date
    Bonjour,

    Je developpe avec matisse, l'éditeur graphique de Netbeans.

    j'ai un JTable contenant comme colone : Date, Nom du fournisseur, reference, designation etc...

    La date est au format jj/mm/aa
    Le tableau est remplit avec une requette SQL qui recupere les champs, les mets dans un tableau d'objets qui ensuite est ajouté au model.

    J'ai créer un rowSorter automatique (en cochant un truc dans netbeans) : l'équivalent de monTableau.autoCreateRowSorter(true);

    Quand je clique sur le nom d'une collone : le tri fonctionne très bien pour les Integer, Double ou Strings... mais pour les dates il croit que c'est un String du coup ca tri mal.

    J'ai déja rechercher sur le forum mais je n'arrive pas à adapter les codes que j'ai trouver à mon code, comment faire pour definir le type d'une colone de mon jTable ? (ici un type Date ou GregorianCalendar).

    Voici le model que j'utilise pour ma jTable

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    //CLASSE MODÈLE PERSONNALISÉE
    	class NonEditableDefaultTableModel extends AbstractTableModel{
     
    		private Object[][] data;
    		private String[] title;
     
    		/**
                     * Constructeur
                     * @param data
                     * @param title
                     */
    		public NonEditableDefaultTableModel(Object[][] data, String[] title){
    			this.data = data;
    			this.title = title;
    		}
     
                    public NonEditableDefaultTableModel(String[] title){
     
    			this.title = title;
    		}
     
    		/**
                     * Retourne le nombre de colonnes
                     */
    		public int getColumnCount() {
    			return this.title.length;
    		}
     
    		/**
                     * Retourne le nombre de lignes
                     */
    		public int getRowCount() {
    			return this.data.length;
    		}
     
                    /**
                    * Retourne le titre de la colonne à l'indice spécifé
                    */
                    public String getColumnName(int col) {
                      return this.title[col];
                    }
     
     
    		/**
                     * Retourne la valeur à l'emplacement spécifié
                     */
    		public Object getValueAt(int row, int col) {
    			return this.data[row][col];
    		}
     
                    /**
                     * Défini la valeur à l'emplacement spécifié
                     */
    		public void setValueAt(Object value, int row, int col) {
    			//On interdit la modification sur certaine colonne !
    			if(!this.getColumnName(col).equals("Age") && !this.getColumnName(col).equals("Suppression"))
    				this.data[row][col] = value;
    		}
     
    		/**
                    * Retourne la classe de la donnée de la colonne
                    * @param col
                    */
    		public Class getColumnClass(int col){
    			//On retourne le type de la cellule à la colonne demandée
    			//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
    			//On choisit donc la première ligne
    			return this.data[0][col].getClass();
     
    		}
     
    		/**
                     * Méthode permettant de retirer une ligne du tableau
                     * @param position
                     */
    		public void removeRow(int position){
     
    			int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
    			Object temp[][] = new Object[nbRow][nbCol];
     
    			for(Object[] value : this.data){
    				if(indice != position){
    					temp[indice2++] = value;
    				}
    				indice++;
    			}
    			this.data = temp;
    			temp = null;
    			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
    			//Ce qui permet une mise à jours complète du tableau
    			this.fireTableDataChanged();
     
    		}
     
    		/**
                     * Permet d'ajouter une ligne dans le tableau
                     * @param data
                     */
    		public void addRow(Object[] data){
     
    			int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount();
     
    			Object temp[][] = this.data;
    			this.data = new Object[nbRow+1][nbCol];
     
    			for(Object[] value : temp)
    				this.data[indice++] = value;
     
     
    			this.data[indice] = data;
    			temp = null;
    			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
    			//Ce qui permet une mise à jours complète du tableau
    			this.fireTableDataChanged();
     
                    }
     
    	}
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il faut que dans le model de ta JTable, le getColumnClass de la colonne que tu veux trier renvoie java.util.Date.class

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Merci pour ton aide.

    J'ai déja esseayer ca :

    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
    /**
                    * Retourne la classe de la donnée de la colonne
                    * @param col
                    */
    		public Class getColumnClass(int col){
    			//On retourne le type de la cellule à la colonne demandée
    			//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
    			//On choisit donc la première ligne
     
                                if (col == 0){
     
                                    return Date.class;
     
                                }else {
     
                                    return this.data[0][col].getClass();
     
                                }
    		}
    Mais ca ne change rien, ca tri toujours comme un String mais a vrai dire ca doit etre normal vu que mes dates sont en fait des Strings.

    Quand mon tableau se charge, il fait une requete sql pour recuperer toutes les valeurs et les mets dans un tableau d'objets qui ensuite est ajouté au model, mais il ne sais pas que date doit etre une Date.

    C'est a ce moment que ca bloque ? il faut que j'écrive un code pour les convertir en Date ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Le probleme c'est que je charge mes JTable avec ce code et difficile d'adapter un type date a partir de ca :s :

    _nomColones est une arraylist contenant les nom des colones de mon JTable
    _requete c'est la requete a effectué par exemple "SELECT * FROM ARTICLE"
    _tableau c'est mon JTable


    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
    private void ChargeTab(ArrayList<String> _nomColones, String _requete, JTable _tableau) throws SQLException, ClassNotFoundException {
     
            java.sql.Statement state = RequeteSQL.getConnexion().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
     
            //On exécute la requête
            ResultSet res = state.executeQuery(_requete);
     
            //On initialise un tableau d'Object pour les en-têtes du tableau
            String[] column = new String[_nomColones.size()];
     
            for (int i = 0; i < _nomColones.size(); i++) {
     
                column[i] = _nomColones.get(i);
     
            }
     
            //Petite manipulation pour obtenir le nombre de lignes
            res.last();
            Object[][] data = new Object[res.getRow()][_nomColones.size()];
     
            //On revient au départ
            res.beforeFirst();
            int j = 1;
     
            //On remplit le tableau d'Object[][]        
            while (res.next()) {
     
                for (int i = 1; i <= _nomColones.size(); i++) {
                    data[j - 1][i - 1] = res.getObject(i);
                }
    Jusque la tous ce qui entre dans mon tableau est sous forme d'objet, comment dire que par exemple la colonne 1 je veux que ce soit une Date, la 2 un Double etc.. ?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Au lieu d'utiliser un tableau d'objets génériques, utilise un tableau de Beans.
    Chaque attribut sera typé, String, Date. A toi en fonction des résultats de ta requête de construire tes objets avec les bon attributs.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    un tableau de Beans ? :o je sais meme pas ce que c'est un beans, je vais me renseigner mais merci de me mettre sur la piste ^^

Discussions similaires

  1. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19
  2. requette sur une date
    Par AlphonseBrown dans le forum Langage SQL
    Réponses: 13
    Dernier message: 04/04/2005, 12h41
  3. Travailler sur une date
    Par HqX dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/10/2004, 15h54
  4. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37
  5. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25

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