Bonjour,
j'aurais besoin de votre aide car il y a une chose que je ne comprends pas. En effet, j'ai créé une interface graphique dans laquelle se trouve un JtextArea. J'essaye actuellement de mettre en oeuvre une fonction d'auto-complétion pour faciliter la saisie aux utilisateurs.
Pour cela, j'ai créé une classe appelée AutoCompletion dans laquelle se trouve une liste qui correspond au dictionnaire de mots qui seront reconnu par la fonction de complétion. :
La liste de completion comprend une longue liste de mots. Pour réaliser la complétion, j'utilise la methode insertUpdate :
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 public class AutoCompletion implements DocumentListener { /** * Paramètres */ private JTextArea EqArea; private List<String> dictionnary; /** * Getter & Setter */ public List<String> getDictionnary() { return dictionnary; } public void setDictionnary(ArrayList<String> dictionnary) { this.dictionnary = dictionnary; } /** * Constructeur par defaut */ public AutoCompletion(JTextArea EqArea){ this.EqArea=EqArea; EqArea.getDocument().addDocumentListener(this); }
Le programme marche mais le résultat obtenu est erroné.
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 /** * Evenement declenché quand l'utilisateur ecrit dans le JTextArea * @param e */ @Override public void insertUpdate(DocumentEvent e) { // TODO Auto-generated method stub //On arrête l'execution de l'evenement si l'utilisateur fait un copier/coller if (e.getLength() != 1) { return; } //On recupère la position du dernier caractère saisi en comptant de 0 int pos = e.getOffset(); String content = null; try { //on recupère ce qu'a saisi l'utilisateur jusqu'à present content = EqArea.getText(0, pos + 1); System.out.print("\nCONTENT : "+ content ); }catch (BadLocationException er) { er.printStackTrace(); } //Find where the word starts int w; for (w = pos; w >= 0; w--) { if (! Character.isLetter(content.charAt(w))) { break; } } if (pos - w < 2) { // Too few chars return; } String prefix = content.substring(w + 1); System.out.print("\nPREFIX : "+ prefix ); //On fait une recherche sur la chaine qu'à saisi l'utilisateur dans les données de l'autocompletion //La methode binarySearch retourne : //- soit l'index de l'élément cherché s'il est contenu dans la collection //- soit le nombre d'élement de la collection si tous les elements sont inferieur à l'élément que l'on cherche //- soit un entier négatif qui représente l'index de permier élément superieur de l'élément qu'on cherche //prefix = String.compareToIgnoreCase(prefix); int index = Collections.binarySearch(dictionnary, prefix); System.out.printf("\nINDEX : " + index); if (index < 0 && -index <= dictionnary.size()) { String match = dictionnary.get(-index - 1); //Completion trouvé --> On recupère le premier element supérieur à la chaine recherché. //Le signe "-" retourne la valeur absolue de la variable index System.out.printf("\nMATCH : " + match); } }
En effet, lorsque je fait : Collections.binarySearch(dictionnary, prefix); j'ai à priori un mauvais index.
Comme le montre le resultat de la console ci-dessous, j'ai le même index pour des prefix différents...
J'ai donc vraiment besoin de vous pour comprendre l'erreur.
Merci d'avance...
Partager