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

avec Java Discussion :

classe JCompletionBox de Marwan KHELIF


Sujet :

avec Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut classe JCompletionBox de Marwan KHELIF
    Salut

    Je viens de trouver du code super mais je n'arrive pas à l'utiliser.

    voilà le classe JCompletionBox:

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    package com.mkhelif.swing;
     
    import javax.swing.ComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.text.AttributeSet;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.JTextComponent;
    import javax.swing.text.PlainDocument;
     
    /**
     * <p>JCompletionBox enable auto-completion on a JComboBox</p>
     * 
     * @author Marwan KHELIF
     * @version Version 1.0 - 03/07/2007
     */
    public class JCompletionBox extends PlainDocument {
    	private static final long serialVersionUID = 1L;
     
        private ComboBoxModel model;
        private JTextComponent editor;
     
        private boolean selecting = false;
     
        /**
         * <p>Enable auto-completion on a JComboBox</p>
         * 
         * @param comboBox - the JComboBox we want to add auto-completion.
         */
        public static void enableAutoCompletion (JComboBox comboBox) {
        	new JCompletionBox (comboBox);
        } // enableAutoCompletion ()
     
        /**
         * <p>Constructor of JCompletionBox</p>
         * @param comboBox the JComboBox we want to add auto-completion
         */
        private JCompletionBox (JComboBox comboBox) {
        	super ();
     
            model = comboBox.getModel ();
            editor = (JTextComponent) comboBox.getEditor ().getEditorComponent ();
     
        	comboBox.setEditable (true);
        	((JTextComponent) comboBox.getEditor ().getEditorComponent ()).setDocument (this);
        } // JCompletionBox ()
     
        /*
         * @see javax.swing.text.AbstractDocument#remove(int, int)
         */
        public void remove (int offs, int len) throws BadLocationException {
            if (selecting) {
            	return;
            }
            super.remove (offs, len);
        } // remove ()
     
        /*
         * @see javax.swing.text.PlainDocument#insertString(int, java.lang.String, javax.swing.text.AttributeSet)
         */
        public void insertString (int offs, String str, AttributeSet a) throws BadLocationException {
            if (selecting) {
            	return;
            }
            super.insertString (offs, str, a);
     
            Object item = lookupItem (this.getText (0, this.getLength ()));
            this.setSelectedItem (item);
    		if (item == null) {
    			return;
    		}
     
    		this.setText (item.toString ());
    		this.highlightCompletedText (offs + str.length ());
        } // insertString ()
     
        /**
         * <p>Replace the text in JComboBox textfield.</p>
         * 
         * @param text - The text to set on JComboBox textfield.
         * @throws BadLocationException
         */
        private void setText (String text) throws BadLocationException {
            super.remove (0, getLength ());
            super.insertString (0, text, null);
        } // setText ()
     
        /**
         * <p>Highlight from start to end of text</p>
         * 
         * @param start - Start of highlighting.
         */
        private void highlightCompletedText (int start) {
            editor.setSelectionStart (start);
            editor.setSelectionEnd (getLength());
        } // highlightCompletedText ()
     
        /**
         * <p>Select item on JComboBox.</p>
         * 
         * @param item - The item to select.
         */
        private void setSelectedItem (Object item) {
            selecting = true;
            model.setSelectedItem (item);
            selecting = false;
        } // setSelectedItem ()
     
        /**
         * <p>Search in JComboBox items to find one which match the pattern.</p>
         * 
         * @param pattern the pattern we are looking for.
         * @return the matching item or null if no item found.
         */
        private Object lookupItem (String pattern) {
            for (int i = 0, n = model.getSize () ; i < n ; i++) {
                Object currentItem = model.getElementAt (i);
                if (startsWithIgnoreCase (currentItem.toString (), pattern)) {
                    return currentItem;
                }
            }
            return null;
        } // lookupItem ()
     
        /**
         * <p>Check if str1 starts with str2 ignoring case.</p>
         * 
         * @param str1
         * @param str2
         * @return true - if str1 starts with str2 ignoring case.
         */
        private boolean startsWithIgnoreCase (String str1, String str2) {
            return str1.toLowerCase ().startsWith (str2.toLowerCase ());
        } // startsWithIgnoreCase ()
    } // JCompletionBox
    J'ai bien comprise que le constructeur JCompletionBox (JComboBox combo) était privé mais je n'arrive pas à utiliser le méthode :
    public static void enableAutoCompletion (JComboBox comboBox)

    (je crois que c'est celle là qu'il faut utiliser mais je ne vois pas comment utiliser une méthode qui doit elle même créer sa propre instance)

    merci de votre aide
    claire

  2. #2
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JCompletionBox.enableAutoCompletion(taCombobox )

  3. #3
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    C'est une méthode statique, tu n'as donc pas besoin d'avoir une instance de la classe pour l'appeler. Il faut simplement faire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JComboBox comboBox = new JComboBox();
    JCompletionBox.enableAutoCompletion(comboBox);
    EDIT: grillé

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    je n'ai pas compris ta réponse;

    Si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JCompletionBox x=new JCompletionBox(maCombo)
    marche pas car private.

    si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JComboBox maCombo=new JComboBox()
    maCombo.enableAutoCompletion(maCombo);
    evidement c'est faux

    autre test que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JCompletionBox x=new JCompletionBox();
    x.enableAutoCompletion(maCombo);
    mais pb avec le constructeur

    donc je ne vois pas comment faire.
    merci de ton aide
    claire

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par claire13 Voir le message
    donc je ne vois pas comment faire.
    Tu relis nos réponses et tu fais pareil ! Faut pas chercher midi à quatorze heure...
    Tu as fait tout SAUF ce qu'on a dit...

  6. #6
    Membre chevronné Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Par défaut
    La méthode est statique donc elle ne s'appelle pas sur une instance mais sur la classe elle-même !


    donc pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JCompletionBox toto = new .JCompletionBox();
    JComboBox maCombo=new JComboBox();
    toto.enableAutoCompletion(maCombo);
    Mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JComboBox maCombo=new JComboBox();
    JCompletionBox.enableAutoCompletion(maCombo);

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    j'ai renvoyé ma réponse en même tant que la tienne et donc je ne te répondais pas à toi (j'essaie quand même de ne pas avoir l'air trop stupide malgré le fait que je sois débutante)

    merci pour ta réponse, je vais la tester de suite.

    claire

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut


    ça marche mais maintenant j'ai un problème car lorsque je cliquais sur un élément de ma liste, ça ouvrait une nouvelle fenetre or là, dès que je tape une lettre ça m'ouvre une fenetre:

    voici mon code pour que ce soit plus clair:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    liste = new JComboBox(listeModel);
    JCompletionBox.enableAutoCompletion(liste);
    liste.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				selectClient(e);
    			}
    		});
    est-ce qu'il y a une solution pour que je sélectionne un élément dans ma liste puis que je fasse selectClient(e) quand je clique sur un bouton???

    merci
    claire

  9. #9
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut


    trouvé, tout simple.

    je mets code si ça interesse plus débutant que moi (on sait jamais):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            liste = new JComboBox(listeModel);
            JCompletionBox.enableAutoCompletion(liste);
                   liste.setMaximumRowCount(5);
                    liste.setBounds (550, 120,300,300);
                    liste.setBackground(Color.WHITE);
            btV.addActionListener(this);
       public void actionPerformed(ActionEvent e) {
        Object obj=e.getSource();
        Object choice = liste.getSelectedItem();
        String choix=(String)choice;
        JOptionPane.showMessageDialog(this,choix,"avertissement",JOptionPane.WARNING_MESSAGE);
     
    			}
    merci encore pour votre aide
    claire

  10. #10
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par claire13 Voir le message
    est-ce qu'il y a une solution pour que je sélectionne un élément dans ma liste puis que je fasse selectClient(e) quand je clique sur un bouton???
    Il vaut mieux découpler oui si possible. Enlever l'action listener de la combo box et créer un autre bouton pour ouvrir ton dialogue de sélection de client.

    Le problème c'est qu'avec l'autocomplétion tu fais une action sur la combo à chaque fois que tu tapes un caractères alors qu'avant tu ne pouvais que sélectionner une valeur directement.

  11. #11
    Membre confirmé
    Inscrit en
    Octobre 2007
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 203
    Par défaut
    merci pour ta réponse et pour ta patience

    a plus
    claire

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

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Élaboration de classe
    Par il_a_ri dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 16/01/2003, 14h22
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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