Bonjour !
Je code en ce moment une application pour une entreprise (je suis en stage chez eux).
Je dois créer un formulaire qui prend les informations d'un appel téléphonique et qui doit ensuite l'attribuer un un commerçant de la boite (la personne qui prend l'appel renseigne les différents champs puis choisit le commercial qui retraitera l'appel derrière).
La première chose c'est d'identifier l'appelant de façon rapide et j'avais pensé mettre une JCombobox en haut qui contient la liste de tous les clients de la boite. Pour chercher rapidement je voulais implémenter dessus un genre de filtre qui fait que seule les entreprises qui correspondent à ce que l'on tape s'affichent.
Comme ça la personne qui prend l'appel tape les premières lettres qui composent le nom de la société et dès qu'elle le voit dans la liste elle clique dessus (si il existe !).
Dans un premier temps j'ai essayé de me créer un composant qui hérite de JCombobox et qui permet de modifier le modèle tout en gardant de côté le modèle original qui contient la liste complète des entreprises.
Le truc c'est que le composant fait un peu n'importe quoi et dès que je tape la première lettre il me sélectionne le premier item de la liste qui correspond et je ne peux pas modifier ma saisie à moins de tout re-sélectionner... pour la rapidité on repassera
Je vous copie-colle le code que j'utilise :
JFilterCombobox.java :
TestFilterCombobox.java :
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 import java.util.ArrayList; import java.util.List; import javax.swing.JComboBox; public class JFilterCombobox extends JComboBox{ private List<String> lst; public JFilterCombobox(List l) { super(); for (int i = 0; i < l.size(); i++) { addItem(l.get(i)); } lst = new ArrayList<String>(l); } public JFilterCombobox(Object[] o) { super(); for (int i = 0; i < o.length; i++) { addItem(o[i]); } lst = new ArrayList<String>(); for (int i = 0; i < getModel().getSize(); i++) { lst.add(getModel().getElementAt(i).toString()); } } public List<Object> showFiltered(String pattern){ List<Object> showed = new ArrayList<Object>(); for (int i = 0; i < lst.size(); i++) { if(startsWithIgnoreCase(lst.get(i), pattern)) { showed.add(lst.get(i)); } } if(showed.size()==0) { showed.add("Aucun résultat"); } removeAllItems(); for (int i = 0; i < showed.size(); i++) { addItem(showed.get(i)); } //setSelectedIndex(-1); return showed; } private boolean startsWithIgnoreCase(String str1, String str2) { if(str1.toUpperCase().startsWith(str2.toUpperCase())) { //System.out.println(str1 + " start with " + str2); return true; } //System.out.println(str1 + " do not start with " + str2); return false; } }
Est-ce que je suis sur la bonne voie ou pas ? J'ai vu quelques codes qui permettaient de faire de l'auto-complétion mais mon utilisation est différente dans le sens où je dois "simplement" filtrer la liste des items tout en l'affichant continuellement.
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 import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JFrame; import javax.swing.text.JTextComponent; import javax.swing.text.PlainDocument; public class TestJFilterCombobox extends PlainDocument{ private JFilterCombobox combobox; private JTextComponent editor; public TestJFilterCombobox(final JFilterCombobox combo) { this.combobox = combo; editor = (JTextComponent) combo.getEditor().getEditorComponent(); editor.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { //Ne pas afficher la liste des items si l'on a rien entré if(editor.getText().length()==0) { combo.setPopupVisible(false); } else { combo.setPopupVisible(true); combo.showFiltered(editor.getText()); } } }); } /** * @param args */ public static void main(String[] args) { createAndShowGUI(); } private static void createAndShowGUI() { JFilterCombobox comboBox = new JFilterCombobox(new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); // has to be editable comboBox.setEditable(true); // get the combo boxes editor component JTextComponent editor = (JTextComponent) comboBox.getEditor().getEditorComponent(); // change the editor's document editor.setDocument(new TestJFilterCombobox(comboBox));//*/ JFrame frame = new JFrame(); frame.setDefaultCloseOperation(3); frame.getContentPane().add(comboBox); frame.pack(); frame.setVisible(true); } }
Je vous remercie d'avance pour votre aide ! Pour ma part j'ai passé la journée là-dessus![]()
Partager