Bonjour,
Je cherche à faire une sorte d'autocomplétion sur un comboViewer.
Par défaut, pour un ComboViwer, à chaque caractère tapé, la recherche se réinitialise.
J'ai essayé de faire un nouveau ComboViewer, qui marche bien à la saisie, mais lorsque je change de focus, la valeur affichée n'est pas la bonne (il met la valeur trouvée pour le dernier caractère tapé ).
Voici mon code, si quelqu'un a une idée pour que la sélection soit bonne, ou si une personne a un meilleur code :Merci
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 import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.KeyListener; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; /** * AutoCompleteComboViewer * permet une meilleur gestion de l'autocomplétion clavier * Forcé en read only * * */ public class AutoCompleteComboViewer extends ComboViewer { private Combo combo; private String selection; private int maxLength = 0; public AutoCompleteComboViewer(Composite parent) { this(parent, SWT.READ_ONLY | SWT.BORDER); } /** * * @param parent * @param style => forcé en READ_ONLY */ public AutoCompleteComboViewer(Composite parent, int style) { super(parent, SWT.READ_ONLY ); combo = getCombo(); selection=""; combo.setVisibleItemCount( 40 ); combo.addKeyListener( new KeyListener(){ public void keyPressed( KeyEvent pArg0 ) { if(!"".equals( selection )) { for(String item : combo.getItems()) { if (item.length() > maxLength){ maxLength = item.length(); } } if (selection.length() >= maxLength){ selection = ""; } } selection=(selection+pArg0.character).toUpperCase(); } public void keyReleased( KeyEvent pArg0 ) { if(!"".equals( selection )) { int i = 0 ; for(String item : combo.getItems()) { if(item.startsWith( selection )) { combo.select( i ); listSetSelection(new int[]{i}); return; } i++; } //si non trouvé, on réinit selection = (""+pArg0.character).toUpperCase(); int j = 0 ; for(String item : combo.getItems()) { if(item.startsWith( selection )) { combo.select( j ); return; } j++; } } } }); combo.addFocusListener( new FocusListener(){ public void focusGained( FocusEvent pArg0 ) { selection=""; } public void focusLost( FocusEvent pArg0 ) { } }); } }
Partager