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

 Java Discussion :

Quel est le principe de la fonction "rechercher" ?


Sujet :

Java

  1. #1
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut Quel est le principe de la fonction "rechercher" ?
    Salut,

    Quel est le principe de la fonction "rechercher" ? Je parle la fonction qui permet de rechercher un mot ou une phrase dans le texte d'une page html affichée par exemple dans un JTextPane.

    Bon c'est clair qu'on peut faire une recherche dans une chaine mais les questions que je me pose sont les suivantes :

    - Il faut bien avoir accès au texte de la page html, non ? C'est moins évident qu'il n'y parait apparemment...
    - Comment repérer la position des éventuels mots ou phrases trouvés ?
    - Et comment les mettre en surbrillance ? J'ai pensé qu'on pourrait changer leur "style" (par exemple changer leur couleur de fond) mais comment faire pour les repérer sans balises ? Faudrait-il en introduire temporairement ?

    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Oui, il faut avoir accès au texte plat, sous forme de chaîne de caractères (String), ce qu'on peut faire par la méthode getText(int offset, int length) (attention getText() retourne le texte sérialisé, donc avec les balises). Ensuite, ensuite on peut trouver la position d'une chaîne dans cette chaîne, par String.indexOf(). Et pour surligner, on pourrait ajouter des balises et du css, mais c'est compliqué et ça altère le texte : le Highlighter permet de réaliser ça très simplement.

    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
    public class DemoFind {
     
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JTextPane textPane = new JTextPane();
     
    		textPane.setContentType("text/html");
    		textPane.setText(
    				"<html><body>"+
    				"<p>Un chasseur sachant chasser le chat sauvage sans son chien est un bon chasseur.</p>"+
    				"</body></html>"
    		);
     
    		find(textPane, "cha", Color.YELLOW);
     
    		frame.getContentPane().add(new JScrollPane(textPane));
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);	
     
    	}
     
    	private static void find(JTextPane textPane, String string, Color color) {
    		try {
    			String content = textPane.getText(0, textPane.getDocument().getLength());
    			int index = content.indexOf(string);
    			while(index>=0) {
    				int end = index+string.length();
    				textPane.getHighlighter().addHighlight(index, end, new javax.swing.text.DefaultHighlighter.DefaultHighlightPainter(color));
    				index = content.indexOf(string, end);
    			}
    		} catch (BadLocationException e) {
    			e.printStackTrace();
    		} 
    	}
     
    }
    Pour une vraie recherche, qu'on doit pouvoir faire plusieurs fois, il faudra supprimer les précents HighlightPainter ajoutés. On peut tous les supprimer d'un coup, mais, parce que éventuellement on peut avoir d'autres highlighters pour d'autres fonctions, on peut aussi sauvegarder ceux qu'on ajoute pour la recherche d'une chaîne, afin de les enlever lors de la nouvelle recherche. Tu peux également avoir un highlighter de couleur différente pour le mot en cours, si tu fais une recherche avec des boutons précédent/suivant, comme surligner tous les mots en jaune, et le mot courant en bleu par exemple.
    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.

  3. #3
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Merci + 1 et résolu !

    Ça marche bien et merci pour l'info sur le Highlighter (je ne connaissais pas).

    Il y a un point que je ne suis pas sûr de comprendre :

    Citation Envoyé par joel.drigo Voir le message
    Salut,

    Oui, il faut avoir accès au texte plat, sous forme de chaîne de caractères (String), ce qu'on peut faire par la méthode getText(int offset, int length) (attention getText() retourne le texte sérialisé, donc avec les balises).
    J'ai ajouté une instruction pour afficher la string "content" dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String content = textPane.getText(0, textPane.getDocument().getLength());
     
    System.out.print(content);
    Et seul le texte est affiché (sans les balises), c'est normal ?

    Bon c'est un détail et encore merci pour le principale.

  4. #4
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Et seul le texte est affiché (sans les balises), c'est normal ?
    Bah, oui, et c'est le but : on fait la recherche sur le texte sans les balises (le texte que l'utilisateur voit et édite). Si on faisait la recherche sur le html, on trouverait des parties dans les balises : comment pourrait-on surligner ces parties alors qu'on ne les voit pas ? Sans parler du fait que les index des parties hors balises seraient décalés à cause des longueurs des balises.
    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.

  5. #5
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Bah, oui, et c'est le but : on fait la recherche sur le texte sans les balises (le texte que l'utilisateur voit et édite). Si on faisait la recherche sur le html, on trouverait des parties dans les balises : comment pourrait-on surligner ces parties alors qu'on ne les voit pas ? Sans parler du fait que les index des parties hors balises seraient décalés à cause des longueurs des balises.
    Oui tout à fait d'accord et c'est justement pourquoi ce passage "attention getText() retourne le texte sérialisé, donc avec les balises)." m'avait turlupiné...

    Tu voulais dire "...sans les balises", non ? Ou bien quelque chose m'échappe ?

    En tous cas ça marche bien !

  6. #6
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Oui tout à fait d'accord et c'est justement pourquoi ce passage "attention getText() retourne le texte sérialisé, donc avec les balises)." m'avait turlupiné...

    Tu voulais dire "...sans les balises", non ? Ou bien quelque chose m'échappe ?

    En tous cas ça marche bien !
    Je voulais juste dire qu'il ne faut pas appeler textPane.getText(), sans argument, parce que ça retourne la version sérialisée conforme au content type.
    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.

  7. #7
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 873
    Points : 3 717
    Points
    3 717
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Je voulais juste dire qu'il ne faut pas appeler textPane.getText(), sans argument, parce que ça retourne la version sérialisée conforme au content type.
    Ah d'accord je comprends mieux maintenant... Alors donc la fonction textPane.getText(int o, int l) permet de récupérer le texte de la page html très facilement alors que certains proposent des solutions plus complexes pour faire cela...

    Bon j'ai encore appris une chose... Merci.

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

Discussions similaires

  1. Quel est le principe du Tchat en ligne ?
    Par zizo89 dans le forum Débuter
    Réponses: 6
    Dernier message: 30/12/2007, 12h17
  2. Quel est le principe de cette technologie
    Par epock29 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 06/03/2007, 09h54
  3. Réponses: 7
    Dernier message: 06/04/2005, 19h18

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