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 créée avec model et filtre, probleme de tri


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut Jtable créée avec model et filtre, probleme de tri
    bonjour à tous

    J'espère être dans la bonne catégorie de message

    me voila en stage et je travaille sur le debeugage d'une application java - hibernate - xml
    et la je coince, je vais donc essayer d'être claire

    J'ai une Jtable dans une Jdialog que l'on ouvre de la fenetre principale (peut être aucune importance). La JTable se rempli apres avoir cliquer sur un bouton (qui appartient à la JDialog)
    On peut eventuellement filtrer les données à afficher
    On peut cliquer sur l'entete d'une colonne pour trier les données affichées.
    ensuite le double clique ouvre la ligne selectionnée dans la fenetre principale

    Mon problème est que si l'on fait un tri sur une colonne (que les lignes ont changé de place) le double clic ouvre la ligne qu'il y a initialement à cette place.

    Un exemple ce sont des vols que l'on tri avec num de vol, date, compagnie (y a plus de données mais ça serait plus compliqué) prenons les données suivantes
    1 - A1234 23/05/06 Finnair
    2 - A1232 24/05/06 Scandinaves
    3 - A1236 27/04/06 Japan
    Si je fais un tri sur le num de vol j'aurais les lignes dans cet ordre : 2 1 puis 3
    mais si je selectionne la 1ere ligne qui contient à l'écran les données du vol A1232 il m'ouvre le vol A1234...
    C'est à peu pres clair ?

    J'ai l'impression que c'est à cause du filtre du coup il filtre pas les données originales. et comme il recupère les données à partir de la liste originale ça beug.
    Donc mes questions sont :
    - Est ce que le filtre sert aussi à filtre les données via des critères (genre que les vols de finnair) ? au quel cas je ne peux pas le retirer
    - Est ce qu'on peut propager le tri à la liste originale ?

    Merci beaucoup
    A+

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je pense que ton problème vient du fait qu'il n'y que l'index d'affichage qui change et pas celui du modèle, ce qui est normal, il te faut donc convertir l'index d'affichage en celui du modèle.

    Il faudrait savoir ce que tu emploies pour trier, car normalement il devrait contenir une méthode du style convertRowIndexToModel ou convertRowModelToIndex (ce sont les méthodes avec la JXTable).

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    coucou

    En effet ils ne servent pas des méthodes que tu cites. Le code est assez long mais les fonctions qui font le tri doivent être celles la :

    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
     
        protected TableModel tableModel;
        private Row[] viewToModel;
        private int[] modelToView;
     
        private Row[] getViewToModel() {
            if (viewToModel == null) {
                int tableModelRowCount = tableModel.getRowCount();
                viewToModel = new Row[tableModelRowCount];
                for (int row = 0; row < tableModelRowCount; row++) {
                    viewToModel[row] = new Row(row);
                }
     
                if (isSorting()) {
                    Arrays.sort(viewToModel);
                }
            }
            return viewToModel;
        }
     
      public int modelIndex(int viewIndex) {
            return getViewToModel()[viewIndex].modelIndex;
        }
     
        private int[] getModelToView() {
            if (modelToView == null) {
                int n = getViewToModel().length;
                modelToView = new int[n];
                for (int i = 0; i < n; i++) {
                    modelToView[modelIndex(i)] = i;
                }
            }
            return modelToView;
        }
     
     
        private class TableModelHandler implements TableModelListener {
            public void tableChanged(TableModelEvent e) {
                // If we're not sorting by anything, just pass the event along.
                if (!isSorting()) {
                    clearSortingState();
                    fireTableChanged(e);
                    return;
                }
     
                // If the table structure has changed, cancel the sorting; the
                // sorting columns may have been either moved or deleted from
                // the model.
                if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
                    cancelSorting();
                    fireTableChanged(e);
                    return;
                }
                int column = e.getColumn();
                if (e.getFirstRow() == e.getLastRow()
                        && column != TableModelEvent.ALL_COLUMNS
                        && getSortingStatus(column) == NOT_SORTED
                        && modelToView != null) {
                    int viewIndex = getModelToView()[e.getFirstRow()];
                    fireTableChanged(new TableModelEvent(TableSorter.this,
                            viewIndex, viewIndex, column, e.getType()));
                    return;
                }
     
                // Something has happened to the data that may have invalidated the
                // row order.
                clearSortingState();
                fireTableDataChanged();
                return;
            }
        }
    J'espère que ce morceaux de code pourra vous éclairer parce que moi j'ai beau allé voir les tuto je suis dans le noir

    Merci
    a+

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Re, je ne trouve pas dans la doc en ligne de java la JXTable Est ce une erreur de frappe ?
    Les methodes convertRowIndexToModel ou convertRowModelToIndex ne sont pas non plus données. Je trouve convertRowIndexToModel pour la classe RowSorter. Est ce que tu peux m'éclairer ?
    Merchi

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    C'est encore moi
    Je pense que j'ai trouvé la méthode dont tu me parlais : convertColumnIndexToModel et ils l'utilisent dans cette class (qui est dans el meme fichier que le reste du code affiché )

    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
     
        private class SortableHeaderRenderer implements TableCellRenderer {
            private TableCellRenderer tableCellRenderer;
     
            public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
                this.tableCellRenderer = tableCellRenderer;
            }
     
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
                Component c = tableCellRenderer.getTableCellRendererComponent(
                        table, value, isSelected, hasFocus, row, column);
                if (c instanceof JLabel) {
                    JLabel l = (JLabel) c;
                    l.setHorizontalTextPosition(JLabel.LEFT);
                    int modelColumn = table.convertColumnIndexToModel(column);
                    l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont()
                            .getSize()));
                }
                return c;
            }
        }

  6. #6
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par pequina
    Re, je ne trouve pas dans la doc en ligne de java la JXTable Est ce une erreur de frappe ?
    Les methodes convertRowIndexToModel ou convertRowModelToIndex ne sont pas non plus données. Je trouve convertRowIndexToModel pour la classe RowSorter. Est ce que tu peux m'éclairer ?
    Merchi
    La JXTable est une classe du projet SwingX dont tu ne vas pas la trouver dans la doc de l'api standard.

    Dans ta classe, ca doit être la méthode modelIndex qu'il faut employer.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Ben ils s'en servent de cette méthodes et ils y font appel (cf. première partie de code donnée)
    Grrr je susi sur que l'erreur est devant moi mais j'arrive pas à saisir.

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

Discussions similaires

  1. Probleme avec utilisation des filtres et des modeles
    Par Djolhan dans le forum Thunderbird
    Réponses: 0
    Dernier message: 08/04/2009, 22h30
  2. Jtable avec model personnalisé
    Par Raphael1980 dans le forum Composants
    Réponses: 2
    Dernier message: 03/03/2009, 21h02
  3. Jtable avec model + Dao + resultSet
    Par Raphael1980 dans le forum Composants
    Réponses: 7
    Dernier message: 01/03/2009, 10h26
  4. [Swing][JTable]pb de header avec Model
    Par yoshï dans le forum Composants
    Réponses: 2
    Dernier message: 19/04/2006, 11h01
  5. [MySQL] probleme d'une requête SQL crée avec phpmyadmin
    Par ghita269 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/10/2005, 10h15

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