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

Composants Java Discussion :

JCombobox avec liste filtrable


Sujet :

Composants Java

  1. #1
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut JCombobox avec liste filtrable
    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 :
    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;
     
        }
    }
    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
    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);
        }
    }
    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.

    Je vous remercie d'avance pour votre aide ! Pour ma part j'ai passé la journée là-dessus

  2. #2
    Membre éclairé Avatar de Julien Bodin
    Homme Profil pro
    Devops
    Inscrit en
    Février 2009
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Devops
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 474
    Par défaut
    Sinon, je viens de tomber sur ce topic

    On y conseille cet article : http://today.java.net/pub/a/today/20...omboboxes.html

    J'ai trouvé mon bonheur à l'intérieur : les Glazed Lists

    On y trouve des composants qui permettent de faire du filtrage, de l'auto-complétion sur plusieurs composants.
    Vraiment un très très bon lien

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

Discussions similaires

  1. JComboBox avec liste infinie
    Par S(ô.Ô)B dans le forum Composants
    Réponses: 2
    Dernier message: 29/05/2009, 13h30
  2. Mal a la tete avec liste chainée d'objet
    Par Raton dans le forum C++
    Réponses: 23
    Dernier message: 03/08/2005, 22h13
  3. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10
  4. Aide à la saisie avec liste déroulante
    Par Oluha dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/02/2005, 09h04
  5. Conditions avec liste de tuples
    Par Robert999 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/07/2004, 11h01

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