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

AWT/Swing Java Discussion :

champ de recherche par sous chaine de caractère


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut champ de recherche par sous chaine de caractère
    Bonjour,

    je viens encore demander de l'aide :

    je cherche à renseigner un JTextField qui permettrait d'effectuer une recherche dans un JTable.
    C'est-à-fire que dès qu'il y aurait une sous chaine saisie dans le JTextfield qui correspondrait à un élément de la JTable, cela me filtrerait uniquement la ligne contenant l'élément (qui contiendrait la sous chaine e caractère) recherché.

    Merci

  2. #2
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    Il faut passer par un RowFilter pour filtrer des données sur une JTable. Il s'enregistre sur le RowSorter, donc il faut en avoir un (il peut se créer automatiquement, par table.setAutoCreateRowSorter(true)).

    Il y a des implémentations par défaut (pour les dates, les filtres par expressions régulières, etc) sinon il faut juste implémenter un méthode qui doit retourner true quand la ligne doit s'afficher, false sinon. On parcourt les colonnes, on peut récupérer la valeur String ou la valeur typée, on fait un test dessus.

    Ensuite, pour que le filtrage réagisse à la saisie dans un champ, un JTextField à priori (mais on peut utiliser des combos, ou tout ce qu'on veut). Sur le JTextField on enregistre un DocumentListener (plus exactement sur son document) pour réagir au fil de la saisie, ou de toute autre modification (par copier/coller, setText(), etc).

    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
    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
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    import java.awt.BorderLayout;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    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.table.TableModel;
    import javax.swing.table.TableRowSorter;
     
    public class JTableFilterExemple {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		String[] cols = {"Nom","Prénom"};
    		Object[][] data = {
    				{"Natalie", "Portman"},
    				{"Clovis", "Cornillac"},
    				{"Vincent", "Cassel"},
    				{"Jason", "Statham"},
    				{"Scarlett", "Johansson"},
    				{"Will", "Smith"},
    				{"Reese", "Witherspoon"},
    				{"Charlize", "Theron"},
    				{"Robert", "De Niro"},
    				{"Cécile", "de France"},
    				{"Alec", "Guinness"},
    				{"Audrey", "Hepburn"},
    				{"Cary", "Grant"},
    				{"Sylvie", "Dorléac"},
    				{"Sean", "Connery"},
    				{"Isabelle", "Adjani"},
    		};
    		JTable table = new JTable(data,cols);
     
     
    		JPanel filterPanel = new JPanel(new GridBagLayout());
    		GridBagConstraints gbc = new GridBagConstraints();
    		gbc.gridx=GridBagConstraints.RELATIVE;
    		gbc.gridy=0;
    		gbc.insets = new Insets(5,5,5,5);
    		filterPanel.add(new JLabel("Filtre : "),gbc);
    		JTextField filterField = new JTextField("");
    		gbc.fill=GridBagConstraints.BOTH;
    		gbc.weightx=1;
    		gbc.weighty=1;
    		filterPanel.add(filterField,gbc);
     
    		JPanel panel = new JPanel(new BorderLayout());
    		frame.add(panel);
     
    		JScrollPane scrollpane = new JScrollPane(table);
    		scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5));
    		panel.add(scrollpane);
    		panel.add(filterPanel, BorderLayout.NORTH);
     
    		// filtres
    		table.setAutoCreateRowSorter(true);
    		TableRowSorter<TableModel> rowsorter = (TableRowSorter<TableModel>) table.getRowSorter();
     
    		filterField.getDocument().addDocumentListener(new DocumentListener() {
     
    			@Override
    			public void removeUpdate(DocumentEvent e) {
    				setFilter();
    			}
     
    			@Override
    			public void insertUpdate(DocumentEvent e) {
    				setFilter();
    			}
     
    			@Override
    			public void changedUpdate(DocumentEvent e) {
    				setFilter();
    			}
     
    			private void setFilter() {
    				String filter = filterField.getText();
    				if( filter.isBlank()) { // si texte vide ou seulement des espaces
    					rowsorter.setRowFilter(null); // suppression du filtre
    				}
    				else {
    					setFilter(filter.trim().split("\\s+"));
    				}
    			}
     
    			private void setFilter(String[] filters) {
     
    				rowsorter.setRowFilter(new RowFilter<TableModel, Integer>() {
     
    					@Override
    					public boolean include(Entry<? extends TableModel, ? extends Integer> entry) {
    						for(String filter : filters) {
    							if ( matches(filter.toLowerCase(), entry) ) {
    								return true;
    							}
    						}
    						return false;
    					}
     
    					private boolean matches(String filter, Entry<? extends TableModel, ? extends Integer> entry) {
    						for(int i=0; i<entry.getValueCount(); i++) {
    							if ( matches(entry.getStringValue(i),filter) ) {
    								return true;
    							}
    						}
    						return false;
    					}
     
    					private boolean matches(String stringValue, String filter) {
    						if ( stringValue!=null && stringValue.toLowerCase().contains(filter) ) {
    							return true;
    						}
    						return false;
    					}
     
    				});
     
    			}
    		});
     
     
     
    		frame.setSize(400, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
     
    }
    Dans cet exemple, tous les mots tapés filtrent séparément, et les filtres ne sont pas sensibles à la casse. Par exemple "ab is" affiche toutes les lignes telles que le nom ou le prénom contient ab ou is. On pourrait ajouter une checkbox qui passe d'un ou à un et (tous les mots doivent matcher en même temps), ou détecter les expressions entre guillemêts pour chercher l'expression complète (avec des espaces dedans), ou rendre configurable la sensibilité à la casse, par une checkbox.
    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.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/04/2010, 14h42
  2. Réponses: 3
    Dernier message: 06/03/2009, 09h59
  3. modifier sous chaine de caractère d'un champs
    Par yanice dans le forum Requêtes
    Réponses: 7
    Dernier message: 15/05/2007, 18h01
  4. Réponses: 4
    Dernier message: 07/12/2006, 11h01
  5. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46

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