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] Filtrage automatique en fonction de la saisie


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut [JComboBox] Filtrage automatique en fonction de la saisie
    Bonjour,

    j'ai un combobox dans lequel les éléments viennet d'un tableau de String.

    J'aimerais filtrer ces éléments au fur et à mesure que l'utilisateur rentre les caractère au clavier.

    Sans rien rajouter, ca marche, mais seulement pour le premier caractère...

    En rajoutant des KeyListener, j'arrive à filtrer (remove+add avec condition)
    Mais je trouve que y' a des prblèmes de syncro avec les listenner (clavier,souris,..)

    Pour l'instant j'utilise un changeStateListenner,FocusLIstenner,KeyListenner.

    N'y a t'il pas une méthode plus simple comme en QT (ca se fait out seul...)

    La je galère, merci de votre aide.

  2. #2
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut C encore moi
    Bon, en cherchant bien et en galérant, j'ai trouvé.

    Je mets la classe que j'ai trouvé sur le net pour ceux que ca interresse.

    Avec un ptit changeStateListenner en plus, ca roule tout seul...
    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
     
    package referencehelptool;
     
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.text.*;
     
    public class AutoComplete extends JComboBox implements JComboBox.KeySelectionManager{
      private String searchFor;
      private long lap;
      public class CBDocument extends PlainDocument{
        public void insertString(int offset, String str, AttributeSet a) throws BadLocationException{
          if (str==null) return;
            super.insertString(offset, str, a);
          if(!isPopupVisible() && str.length() != 0) fireActionEvent();
        }
      }
      public AutoComplete(Object[] items){
        super(items);
        lap = new java.util.Date().getTime();
        setKeySelectionManager(this);
        JTextField tf;
        if(getEditor() != null){
          tf = (JTextField)getEditor().getEditorComponent();
          if(tf != null){
            tf.setDocument(new CBDocument());
            addActionListener(new ActionListener(){
              public void actionPerformed(ActionEvent evt){
                JTextField tf = (JTextField)getEditor().getEditorComponent();
                String text = tf.getText();
                ComboBoxModel aModel = getModel();
                String current;
                for(int i = 0; i < aModel.getSize(); i++){
                  current = aModel.getElementAt(i).toString();
                  if(current.toLowerCase().startsWith(text.toLowerCase())){
                    tf.setText(current);
                    tf.setSelectionStart(text.length());
                    tf.setSelectionEnd(current.length());
                    break;
                  }
                }
              }
            });
          }
        }
      }
      public int selectionForKey(char aKey, ComboBoxModel aModel){
        long now = new java.util.Date().getTime();
        if (searchFor != null && aKey==KeyEvent.VK_BACK_SPACE && searchFor.length()>0){
          searchFor = searchFor.substring(0, searchFor.length() -1);
        }
        else{
          if(lap + 1000 < now)
            searchFor = "" + aKey;
          else
            searchFor = searchFor + aKey;
          }
          lap = now;
          String current;
          for(int i = 0; i < aModel.getSize(); i++){
            current = aModel.getElementAt(i).toString().toLowerCase();
            if (current.toLowerCase().startsWith(searchFor.toLowerCase()))
              return i;
          }
          return -1;
      }
      public void fireActionEvent(){
        super.fireActionEvent();
      }
      public static void main(String arg[]){
        JFrame f = new JFrame("AutoCompleteComboBox");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(200,300);
        Container cp= f.getContentPane();
        cp.setLayout(null);
        Locale[] locales = Locale.getAvailableLocales();
        JComboBox cBox= new AutoComplete(locales);
        cBox.setBounds(50,50,100,21);
        cBox.setEditable(true);
        cp.add(cBox);
        f.setVisible(true);
      }
     
      public AutoComplete() {
        try {
          jbInit();
        }
        catch(Exception e) {
          e.printStackTrace();
        }
      }
      private void jbInit() throws Exception {
        this.setFont(new java.awt.Font("Dialog", 1, 16));
        this.setEditable(true);
        this.setPopupVisible(true);
      }
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    ton code est un peu long, tu peux regarder ici pour une solution plus courte à ton problème
    http://today.java.net/pub/a/today/20...omboboxes.html

    je vois que mon post est un peu en retard par rapport aux message mais bon, j'espère qu'il sera utile à d'autres.....

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 25/04/2007, 16h16
  2. Problème pour ajouter un texte automatique dans un zone de saisie de texte
    Par koKoTis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 21/08/2006, 17h03
  3. Réponses: 12
    Dernier message: 27/03/2006, 15h59
  4. [JComboBox] editable avec % affiché en fin de saisie
    Par tomburn dans le forum Composants
    Réponses: 6
    Dernier message: 27/04/2005, 17h41

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