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 :

Filtrer le contenu d'un jtable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut Filtrer le contenu d'un jtable
    Bonjour,
    J'affiche le contenu de ma table postgres dans un jtable, je veux filtrer l'affichage de mon jtable en fonction des lettres saisies dans un jtextfield.
    J'ai deja fait des recherches mais je n'ai pas trouver quelque chose qui me satisfait.

    Merci bien pour votre aide.

  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
    Un JTextField couplé à un document listener qui applique un nouveau regexFilter à ta JTable à chaque changement de caractère dans le JTextField.

    Le contenu du JTextField doit bien sur être escapé au préalable, et suivi (voir entouré si l'on veut chercher des chaines en plein milieu de valeurs, et non uniquement au début) de wildwards regexp.

    par exemple:

    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
     
    package swing.table;
     
    import java.util.regex.Pattern;
     
    import javax.swing.DefaultRowSorter;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.RowFilter;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Document;
     
    public class TableFiltering {
     
    	private JTextField filterTextField;
    	private JTable filteredTable;
     
    	public TableFiltering() {
    		filteredTable = new JTable();
    		filteredTable.setAutoCreateRowSorter(true);
    		filterTextField = new JTextField();
    		filterTextField.getDocument().addDocumentListener(
    				new DocumentListener() {
     
    					@Override
    					public void removeUpdate(DocumentEvent e) {
    						Document d = e.getDocument();
    						try {
    							applyTableFilter(d.getText(0, d.getLength()));
    						} catch (BadLocationException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    					}
     
    					@Override
    					public void insertUpdate(DocumentEvent e) {
    						Document d = e.getDocument();
    						try {
    							applyTableFilter(d.getText(0, d.getLength()));
    						} catch (BadLocationException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    					}
     
    					@Override
    					public void changedUpdate(DocumentEvent e) {
    						Document d = e.getDocument();
    						try {
    							applyTableFilter(d.getText(0, d.getLength()));
    						} catch (BadLocationException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    					}
    				});
    	}
     
    	private void applyTableFilter(String filterText) {
    		// On escape le texte afin que son contenu ne soit pas considéré comme
    		// une regexp
    		String escapedFilterText = Pattern.quote(filterText);
    		// On ajoute les wildcards a gauche et a droite
    		String completeFilterText = ".*" + escapedFilterText + ".*";
    		// On applique le filtre a la JTable
    		((DefaultRowSorter) filteredTable.getRowSorter())
    				.setRowFilter(RowFilter.regexFilter(completeFilterText));
    	}
    }

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 308
    Par défaut filtrer ma jtable
    Bonjour,
    Merci bien sinok,
    j'avoue que je n'arrive pas à m'ensortir c'est à dire faire marcher votre code chez moi.
    En fait sur ma jframe j'ai un champ jtextfield (nom = filtre) et un jtable (nom = liste). Dans mon cas concret comment appliquer votre code pour les faire communiquer? en fait depuis votre reponse passée je ne fais que tester mais je n'arrive pas.
    Est ce qu'il faut inserrer le code dans un nouveau fichier ou le laisser dans le code de ma jframe?
    Comment doit se faire l'appel au niveau de mon jtextfield pour que à chaque frappe d'une touche le jtable reagisse?

    en fait j'avais fait tous ces elements sous Delphi, mais avec java je ne me retrouve pas.
    Merci de de votre aide.

  4. #4
    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
    Voici une version avec une JFrame et des données...

    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
    package swing.table;
     
    import java.awt.BorderLayout;
    import java.util.regex.Pattern;
     
    import javax.swing.DefaultRowSorter;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.RowFilter;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.Document;
     
    public class TableFiltering {
     
    	private JTextField filterTextField;
    	private JTable filteredTable;
    	private JFrame f;
     
    	public TableFiltering() {
    		String[] cols = { "A", "B", "C", "D" };
    		String[][] data = { { "Toto", "Machin", "bidule", "Truc" },
    				{ "abc", "def", "ghi", "jkl" } };
    		filteredTable = new JTable(data, cols);
    		filteredTable.setAutoCreateRowSorter(true);
    		filterTextField = new JTextField();
    		filterTextField.getDocument().addDocumentListener(
    				new DocumentListener() {
     
    					@Override
    					public void removeUpdate(DocumentEvent e) {
    						applyTableFilter(filterTextField.getText());
    					}
     
    					@Override
    					public void insertUpdate(DocumentEvent e) {
    						applyTableFilter(filterTextField.getText());
    					}
     
    					@Override
    					public void changedUpdate(DocumentEvent e) {
    						applyTableFilter(filterTextField.getText());
    					}
    				});
    		f = new JFrame();
    		f.add(new JScrollPane(filteredTable));
    		f.add(filterTextField, BorderLayout.SOUTH);
    		f.setSize(400, 300);
    		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		f.setLocationRelativeTo(null);
    		f.setVisible(true);
    	}
     
    	private void applyTableFilter(String filterText) {
    		// On escape le texte afin que son contenu ne soit pas considéré comme
    		// une regexp
    		String escapedFilterText = Pattern.quote(filterText);
    		// On ajoute les wildcards a gauche et a droite
    		String completeFilterText = ".*" + escapedFilterText + ".*";
    		// On applique le filtre a la JTable
    		((DefaultRowSorter) filteredTable.getRowSorter())
    				.setRowFilter(RowFilter.regexFilter(completeFilterText));
    	}
     
    	public static void main(String[] args) {
    		new TableFiltering();
    	}
    }
    Le concept est que le DocumentListener va appeler une de ses méthodes à chaque changement du contenu du JTextField (la méthode étant choisie automatiquement par swing suivant le type de changement).

    Il suffit donc dans ces méthodes de récupérer le contenu du JTextField, et de l'appliquer en tant que filtre sur la JTable. C'est ce que fait la méthode applyTableFilter. Il n'y a absolument rien de magique ni complexe...

  5. #5
    Membre très actif
    Inscrit en
    Mars 2009
    Messages
    191
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2009
    Messages : 191
    Par défaut
    si j'ai bien compris ta jtable est alimenté par une requete,
    tu n'auras qu'à declenche une methode sur l'evenement keypressed de ton jtextfield.
    cette methode sera comme ta methode de chargement de jtable de depart, sauf que dans ta requete(ecrite dans ta methode) sera du type: select * from table where champs like jtextfield.gettext() +'%'
    ça veut dire à chaque frappe clavier dans ton jtextfield la methode va s'executer.


    j'espere avoir repondu à ta question

    merci de marquer la discussion resolue

Discussions similaires

  1. Imprimer le contenu d'une JTable?
    Par Sancho_54 dans le forum Composants
    Réponses: 5
    Dernier message: 10/12/2019, 21h22
  2. Filtrer le contenu d'un état
    Par quentin1860 dans le forum IHM
    Réponses: 8
    Dernier message: 19/12/2006, 19h17
  3. [XSLT]Expression régulière pour filtrer le contenu d'un noeud
    Par Matthieu Brucher dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 17/10/2006, 15h35
  4. COmment imprimer tout le contenu de la JTable
    Par L4BiN dans le forum Composants
    Réponses: 1
    Dernier message: 04/08/2006, 10h20
  5. [JTABLE]trier et filtrer les données d'une jTable
    Par mehdi82 dans le forum Composants
    Réponses: 4
    Dernier message: 15/12/2005, 17h59

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