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 :

RowFilter dans JTable


Sujet :

Composants Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut RowFilter dans JTable
    Bonjour à tous,
    J'ai une jTable qui possède plusieurs colonnes reliées à une base de données.
    La plupart de ces colonnes sont au format "String" sauf deux qui sont au format "Date". En fait j'utilise une classe qui convertit le format "String" en format "Date" afin d'avoir un affichage cohérant de dates, par exemple : 03/02/12 au lieu de 2012-02-03.

    J'utilise une zone de recherche, un jTextfield, qui me permet de rechercher des données dans la jTable.
    Pour cela j'utilise un code de programme qui comporte les mots clefs "Rowfilter" et "regexFilter"..c'est à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sorter.setRowFilter( RowFilter.regexFilter(text));
    etc...
    M'enfin le code classic donné sur le net...

    Avant j'avais mes champs de dates sous format "VarChar" donc "String" en jTable et lorsque j'effectuait une sélection de recherche sur la date par exemple : 02/02/12..il me la trouvait dans la jTable..
    Pour des raisons prtaique et de logique, j'ai dû modifier ces champs en format "Date" et donc comme cité précédement, créer une classe qui me change le format d'affichage dans la jTable, sinon j'avais un affichage de date avec le nom du jour, les mois années ainsi que heures/minutes et secondes..


    Maintenant le problème que je rencontre est que si j'effectue une recherche par date, il ne me la trouve pas, malgré un affichage identique existant dans la jTable. Exemple si j'ai la date "03/11/11" et que je commence à saisir en recherche : "03" ( donc les premiers chiffres de la date), il commence à m'afficher la date dans la jTable..normal..étant donné qu'il trouve le "03"..
    Mais dès que je continue à taper mon texte : "03/",donc le slash.. il ne trouve plus en recherche dans la jTable..et m'affiche un tri de jTable vide..
    Et si je continue à taper "03/11/"..etc..toujours rien..
    Alors que la date est bien présente en affichage dans la jTable.
    Je suppose que cela est dû au fait que les données sont au format "Date" et non plus "String"... ?
    Comment puis je procéder ..faut t'il mettre un autre mot clef à "regexFilter" ? pour qu'il tienne compte de ce format en cas de recchercher ?
    A noter que les autres données il me les trouves quand je tape le texte de recherche..et donc ce sont les données sous format "String " dans ma jTable..

    Merci d'avance pour votre aide..
    A+

  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
    Le / est un caractère spécial dans les regex.

    Donc il te faut escaper la chaîne que tu veux chercher avant de la passer au regexFilter.
    Dans ton cas:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sorter.setRowFilter( RowFilter.regexFilter(Pattern.quote(text)));

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    Merci pour ton aide..
    Oui mais avant mes champs de date des tables étaient en format [Varchar] au lieu de [Date] et donc la jTable y était relié..et lorsque j'effectuait la recherche avec regexFilter tout court..les "/" ça fonctionnait..
    C'est depuis que j'ai modifié les types de champs en [Date] et créer une classe qui formatte sous bonne date la jTable que j'ai ce problème..
    Mais je vais essayer ce soir la modification.

    Merci pour ton coup de main...
    A+

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    Je viens de tester..mais ça ne fonctionne pas...

  5. #5
    Membre actif Avatar de dotEden
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 66
    Par défaut
    Citation Envoyé par Telemak Voir le message
    Je viens de tester..mais ça ne fonctionne pas...
    Bonsoir,

    Sinon pour la recherche, au lieu de demander de saisir la date à l'utilisateur, tu peux la lui faire sélectionner par trois zones de liste, ainsi tu auras une zone de liste jour qui va de 01 à 31, 30, 29 ou 28; une zone de liste mois qui va de Janvier à Décembre, et une dernière qui va de 1901 à 2091 (par exemple).
    Cette méthode t'évitera des erreurs de saisies de la part de l'utilisateur.
    Bon courage.

    Cordialement

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    Merci pour ton post dotEden..
    Les idées sont les bienvenues..
    Malheureusement ça alourdirait mon programme..
    Tant que ma jTable était formatée en "String", la zone de recherche fonctionnait parfaitement, même avec la présence de date sous format "13/12/11". Dès que je commençait à taper "13/" il me la trouvait, et ensuite si je continuait à taper "13/1"..et ainsi de suite, il continuait à affiner la recherche dans la jTable.
    C'est depuis que j'ai dû modifier les champs qui enregistrait des saisies de dates (mais qui était sous type "VarChar'') de ma base de données que ça ne fonctionne plus.
    En fait la base de données étant maintenant de type '"Date" le format d'enregistrement est le suivant : 2011-12-13 en quelque sorte.
    Pour avoir une affichage propre dans la jTable qui est reliée à cette base de données..j'ai dû créer une classe qui me formatte l'afffichage des dates sous 13/12/11 au lieu d'avoir le format : thu-2011-12-13- 24h00:00 ..m'enfin un truc à rallonge ne me servant à rien dans mon cas.
    Mon avis c'est là que le "Rejex" n'arrive plus à lire la zone correctement.
    J'ai juste du mal à comprendre pourquoi..il n'arrive pas à chercher l'affichage tel qu'il apparaît à l'écran..
    J'ai essayé de tracer les données en sortie des variables ça me donne cela :
    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
    javax.swing.table.TableRowSorter@7976fbd
    javax.swing.RowFilter$RegexFilter@6728e52f
    0
    javax.swing.table.TableRowSorter@36ff3f31
    javax.swing.RowFilter$RegexFilter@2f8dc62c
    09
    javax.swing.table.TableRowSorter@5db51cd5
    javax.swing.RowFilter$RegexFilter@1d781403
    09
    javax.swing.table.TableRowSorter@2ca45305
    javax.swing.RowFilter$RegexFilter@58468428
    09/
    javax.swing.table.TableRowSorter@196008b8
    javax.swing.RowFilter$RegexFilter@6fdc750b
    09/
    javax.swing.table.TableRowSorter@fe57659
    javax.swing.RowFilter$RegexFilter@21bcd536
    09/1
    javax.swing.table.TableRowSorter@3b690c36
    javax.swing.RowFilter$RegexFilter@6da0cbb2
    09/1
    javax.swing.table.TableRowSorter@253c2a95
    javax.swing.RowFilter$RegexFilter@110faf4c
    09/12
    javax.swing.table.TableRowSorter@6941c289
    javax.swing.RowFilter$RegexFilter@5c4ae65b
    09/12
    javax.swing.table.TableRowSorter@1f0c039e
    javax.swing.RowFilter$RegexFilter@4dc189fe
    09/1
    javax.swing.table.TableRowSorter@5104c8be
    javax.swing.RowFilter$RegexFilter@11175b80
    09/1
    javax.swing.table.TableRowSorter@1f75c51d
    javax.swing.RowFilter$RegexFilter@6ce0030d
    09/
    javax.swing.table.TableRowSorter@2ac40a46
    javax.swing.RowFilter$RegexFilter@2c7e8f99
    09/
    javax.swing.table.TableRowSorter@67c0496a
    javax.swing.RowFilter$RegexFilter@114035d
    09/0
    javax.swing.table.TableRowSorter@2c7c8aed
    javax.swing.RowFilter$RegexFilter@2484e46c
    09/0
    javax.swing.table.TableRowSorter@22ea422c
    javax.swing.RowFilter$RegexFilter@419e689c
    09/02
    javax.swing.table.TableRowSorter@64dd72fd
    javax.swing.RowFilter$RegexFilter@6a873c7
    09/02
    javax.swing.table.TableRowSorter@3adcbc57
    javax.swing.RowFilter$RegexFilter@71d111f1
    09/02/
    javax.swing.table.TableRowSorter@7b8d4157
    javax.swing.RowFilter$RegexFilter@76bcf61f
    09/02/
    javax.swing.table.TableRowSorter@56a8f5e
    javax.swing.RowFilter$RegexFilter@16ea6719
    09/02/1
    javax.swing.table.TableRowSorter@6ff05fdd
    javax.swing.RowFilter$RegexFilter@e25df95
    09/02/1
    javax.swing.table.TableRowSorter@2e86563d
    javax.swing.RowFilter$RegexFilter@7587d6a7
    09/02/12
    javax.swing.table.TableRowSorter@5a929945
    javax.swing.RowFilter$RegexFilter@4e8caf77
    09/02/12
    javax.swing.table.TableRowSorter@648feaad
    javax.swing.RowFilter$RegexFilter@2478376f
    Donc il arrive bien à lire la progression de ma saisie ...dans le jTextfield..mais au niveau regex...rien du tout..
    J'ai un peu de mal à comprendre..

    A+

  7. #7
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    un composant ? JDateEChooser, JXDatePicker, JCalender ?

    pourrait convenir ?

  8. #8
    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
    Tu peux parfaitement utiliser deux filter en parallèle en passant par un andFilter ou un orFilter.

    Avec un RegexFilter pour toutes tes colonnes sauf celle des dates et un DateFilter pour la colonne de dates.

    Avec deux composants différents, un pour le filtrage de dates tel un JCalendar ou un JXDatePicker, et un pour le filtrage de texte, probablement un JTextField.

    Le problème ici vient du fait que les Filter s'appliquent au niveau du modèle, alors que la mise en forme de la date s'effectue au moment du rendu par le Renderer.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    J'y avait pensé au datFilter...mais d'après ce que j'ai vu c'est qu'il indexe la date avec du "AFTER" ou "BEFORE" de mémoire..Je suis d'accord qu'on peut y arriver en effectuant soit une soustraction ou addition de la date pour arriver à la bonne date recherchée..
    Je n'ai pas l'impression qu'il s'agit dans mon cas de la bonne méthode..
    Par contre je suis sur une autre piste...qui me parait meilleure :
    - Je récapitule :
    Avant tant que je n'avais pas mis la jTable sous format date ça fonctionnait parfaitement avec le regexFilter..
    Depuis que j'ai crée une classe qui "formate" les dates des colonnes de la JTable, j'ai le soucis..
    J'en conclus que regexFilter n'arrive plus à reconnaître ces colonnes car elle ne sont plus formatées en "String" mais en "Date"...
    Alors pourquoi ne pas refaire l'inverse....c'est à dire de lui faire ignorer la classe qui formate en date et de rechanger le modelTable pour que ces colonnes de la jTable se retrouve sous format "String"..c'est à dire le temps de la recherche...?

    Qu'en pensez vous...?

    Par contre je n'aurais plus le temps de voir ce soir..je m'y pencherais dessus ce week end..

    En tous les cas merci à vous tous pour votre aide et vos conseils ..
    Suis toujours preneur de vos idées..même si je ne donne pas forcément suite..mais c'est ce qui me permet d'avancer... grâce à vous..

    A++

  10. #10
    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
    Non, il permet aussi de faire du EQUALS ou du NOT_EQUALS...

    cf http://docs.oracle.com/javase/6/docs...risonType.html

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    J'ai testé avec le datFilter Equals...
    C'est plus simple que de recréer la jTable sous format "String"...
    A priori ça a l'air de fonctionner...le temps de faire quelques tests ces prochains jours...
    Je déleste le sujet pour l'instant...

    Merci pour l'aide...

    A++

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    465
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 465
    Par défaut
    Merci à vous ça fonctionne avec le avec le datFilter Equals...
    Donc résolu...
    A+

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

Discussions similaires

  1. Enregistrement valeur dans jtable
    Par piro dans le forum Composants
    Réponses: 4
    Dernier message: 05/04/2006, 14h51
  2. [JTable][RadioButton]Afficher groupe de boutons dans JTable
    Par leminipouce dans le forum Composants
    Réponses: 11
    Dernier message: 21/02/2006, 17h04
  3. Vérification de l'etat des JComboBox dans JTable
    Par nicotine002 dans le forum Composants
    Réponses: 5
    Dernier message: 26/01/2006, 11h47
  4. combobox dans jtable
    Par nicotine002 dans le forum Composants
    Réponses: 1
    Dernier message: 10/01/2006, 23h01
  5. Selection listener dans JTable
    Par calypso dans le forum Composants
    Réponses: 3
    Dernier message: 02/08/2004, 17h56

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