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 :

Y a t-il un surdoue pour expliquer un morceau de code - Autocompletion combobox dans jtable


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut Y a t-il un surdoue pour expliquer un morceau de code - Autocompletion combobox dans jtable
    Bonjour à tous,

    J'ai un objectif tout simple : mettre une combobox auto-completion dans une jtable. Apres plusieurs recherche j'ai trouve un dieu qui à fait ça dans un forum et je dois avouer et c'est à des années lumières de mon niveau en java.

    Alors si quelqu'un pouvait m'expliquer ça serait cool.


    Voici le code en question

    private TableCellEditor createExampleEditor() {


    La il cree la jcombobox, ça c'est facile..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            JComboBox combo = new JComboBox(new Object[] {
                    "apple",
                    "orange",
                    "kiwi",
                    "pineapple",
                    "banana",
            })

    La, dèjà je comprend pas comment il possible d'ouvrir des accolades dans une nouvelle fonction



    Et la, je comprend plus rien, j'ai l'impression qu'il creer une fonction dans la fonction createExampleEditor()
    Mais quelle superclasse il fait appel quand il fait super.processKeyBinding puis je comprend pas il envoi des arguments qu'il à même pas renseigné avant (ks, e, condition, pressed))

    Premiere méthode dans la méthode createExampleEditor()
    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
     
     
                protected boolean processKeyBinding(KeyStroke ks, KeyEvent e,
                        int condition, boolean pressed) {
     
                    boolean retValue = super.processKeyBinding(ks, e, condition, pressed);
     
                    if (!retValue && isStartingCellEdit() && editor != null) {
                        // this is where the magic happens
                        // not quite right; sets the value, but doesn't advance the
                        // cursor position for AC
                        editor.setItem(String.valueOf(ks.getKeyChar()));
                    }
     
                    return retValue;
                }
    Deuxieme méthode dans la méthode createExampleEditor()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
       private boolean isStartingCellEdit() {
                    JTable table = (JTable) SwingUtilities.getAncestorOfClass(
                            JTable.class, this);
     
                    return table != null
                            && table.isFocusOwner()
                            && !Boolean.FALSE.equals((Boolean) table
                                    .getClientProperty("JTable.autoStartsEdit"));
                }
    Enfin il cloture ces méthodes dans les méthodes ... je suis pommé la ...

    Enfin il met à jour la combobox enfinje crois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
            AutoCompleteDecorator.decorate(combo);
     
            return new ComboBoxCellEditor(combo);
        }
    Fin de la methode createExampleEditor()



    et le code dans dans sa totalité pouyr ce qui veulent tester :

    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
     
    import java.awt.event.KeyEvent;
     
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.table.TableCellEditor;
    import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
    import org.jdesktop.swingx.autocomplete.ComboBoxCellEditor;
     
    public class AutoStartEditTest extends JFrame {
        protected void frameInit() {
            super.frameInit();
     
            setDefaultCloseOperation(EXIT_ON_CLOSE);
     
            JTable table = new JTable(2, 10);
            table.getColumnModel().getColumn(0).setCellEditor(createExampleEditor());
     
            table.setSurrendersFocusOnKeystroke(true);
     
            add(new JScrollPane(table));
     
            pack();
        }
     
        private TableCellEditor createExampleEditor() {
     
     
     
            JComboBox combo = new JComboBox(new Object[] {
                    "apple",
                    "orange",
                    "kiwi",
                    "pineapple",
                    "banana",
            }) 
     
            {
                protected boolean processKeyBinding(KeyStroke ks, KeyEvent e,
                        int condition, boolean pressed) {
                    System.out.println("\ntouche");
                   // super.
                    boolean retValue = super.processKeyBinding(ks, e, condition, pressed);
     
                    if (!retValue && isStartingCellEdit() && editor != null) {
                        // this is where the magic happens
                        // not quite right; sets the value, but doesn't advance the
                        // cursor position for AC
                        editor.setItem(String.valueOf(ks.getKeyChar()));
                    }
     
                    return retValue;
                }
     
                private boolean isStartingCellEdit() {
                    JTable table = (JTable) SwingUtilities.getAncestorOfClass(
                            JTable.class, this);
     
                    return table != null
                            && table.isFocusOwner()
                            && !Boolean.FALSE.equals((Boolean) table
                                    .getClientProperty("JTable.autoStartsEdit"));
                }
            };
            AutoCompleteDecorator.decorate(combo);
     
            return new ComboBoxCellEditor(combo);
        }
     
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                System.out.println("error setting l &f " + e);
            }
     
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new AutoStartEditTest().setVisible(true);
                }
            });
        }
    }

    Merci pour votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     JComboBox combo = new JComboBox(new Object[] {
                    "apple",
                    "orange",
                    "kiwi",
                    "pineapple",
                    "banana",
            })
    Il passe au constructeur de la classe JCombobox, un tableau d'objets.
    Il évite ainsi deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     Object[] tab = new Object[] {
                    "apple",
                    "orange",
                    "kiwi",
                    "pineapple",
                    "banana"};
     JComboBox combo = new JComboBox(tab)
    Ensuite il ouvre une accolade ouvrante car La combo en question sera une classe dérivée de JCombobox, dont il redéfinit la méthode processKeyBinding et implémente une nouvelle méthode isStartingCellEdit.

    C'est plus clair ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Bonjour,

    il a tout simplement surchargé certaines fonctions de la classe JCombobox et ajouté d'autres fonctions.
    C'est une façon raccourci de le faire, c'est peut être pour ca que t'étais un peu perdu.

    Cdlt

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par icicmoi Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            JComboBox combo = new JComboBox(new Object[] {
                    "apple",
                    "orange",
                    "kiwi",
                    "pineapple",
                    "banana",
            })

    La, dèjà je comprend pas comment il possible d'ouvrir des accolades dans une nouvelle fonction
    Ben comme tu le devine, il se content de créer un tableau de string et de le passer en paramètre au constructeur. Tu peux très bien mettre du code dans un appel de fonction, c'est sa valeur de retour qui servira de paramètre. Exemples:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    machin.trucMuch(new ArrayList());
    machin.trucMuch(new StringBuffer().append(x).append(y).toString());
    machin.trucBidule(new Object[0]);
    //et dans ton cas
    machin.trucBidule(new Object[]{"un","deux"});
    //qui n'est qu'un raccourci de 
    Object[] os = new Object[] {"un","deux"};
    machin.trucBidule(os);


    Et la, je comprend plus rien, j'ai l'impression qu'il creer une fonction dans la fonction createExampleEditor()
    Il crée simplement ce qu'on appelle une anonymous inner class. C'est une classe, qui dérive d'une autre et qui n'a pas de nom de classe particulier. C'est assez pratique pour les classes à usage unique. Ca se crée simplement en ouvrant un accolade juste après l'appel au constructeur

    Exemple simple (et plus facile a lire je pense) avec un classe anonyme implémentant l'interface MouseListener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MouseListener myListener = new MouseListener(){
     public void 	mouseClicked(MouseEvent e){
        // faire qqch ici ;)
     }
     public  void 	mouseEntered(MouseEvent e){
     }
     public  void 	mouseExited(MouseEvent e){
     }
     public  void 	mousePressed(MouseEvent e){
     }
     public  void 	mouseReleased(MouseEvent e) {
     }
    }
    Mais quelle superclasse il fait appel quand il fait super.processKeyBinding
    A la méthode keyBinding de JComboBox, puisque c'est de cette classe qu'il hérite au moment de l'appel à la méthode.

    puis je comprend pas il envoi des arguments qu'il à même pas renseigné avant (ks, e, condition, pressed))
    Il les recoit en paramètre à l'appel de la méthode keybindings.

    Basiquement, ce code crée un sous-classe de JCombobox, surcharge deux méthode puis construit une instance de cette classe en passant un tableau de strings au constructeur.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut
    Merci pour vos réponses, j'y vois un peu plus plus clair désormais.
    Il est vrai que je connaissais pas cette notation !

    Toutefois, donc à la fin du code quand il fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                System.out.println("error setting l &f " + e);
            }
     
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new AutoStartEditTest().setVisible(true);
                }
            });
        }
    Il surcharge donc la methode Runnable() .... c'est bien ça ?

    Lorsque l'on effectue ce type de manipulation, cela permet d'ajouter des méthodes à la classe existante ?

    Si on place des paramètres identique dans la méthode, on écrase la méthode , donc on parle de redéfinition c'est bien ça?

    Si on place des paramètres différents dans la méthode, on ecrase la methode , donc on parle de surcharge c'est bien ça?

    Donc, ce genre de manipulation demande donc de bien connaitre comment ont été développés les objets de base.D'ailleurs les objets de base on les trouve ou ? Ya il un moyen simple de lire les sources sans chercher partout dans les fichiers jar ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Runnable est une interface.
    Il crée donc une classe implémentant l'interface Runnable et redéfinit sa méthode run.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par icicmoi Voir le message

    Lorsque l'on effectue ce type de manipulation, cela permet d'ajouter des méthodes à la classe existante ?
    Tu dérive une classe ou implémente une méthode. Dans les deux cas tu peux faire tout ce que tu fait habituellement quand tu code un classe: surcharger/redéfinir les méthodes du parent, ajouter des méthodes, ajouter des champs

    Donc, ce genre de manipulation demande donc de bien connaitre comment ont été développés les objets de base.D'ailleurs les objets de base on les trouve ou ? Ya il un moyen simple de lire les sources sans chercher partout dans les fichiers jar ?
    Toutes les classes de base sont définies dans l'api java. Donc une consultation de la javadoc suffit. Il n'y a pas plus de connaissance à avoir pour faire des anonymous inner classe que quand tu dérive d'une manière "habituelle" un classe existante. Les anonymous inner class on cependant deux restrictions

    1) elles ne savent pas implémenter plusieurs interface
    2) elles n'on qu'un seul constructeur qui est hérité du parent et dépend de l'appel.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut
    Je m'endormirais moins bête ce soir encore !!
    Merci encore.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/08/2012, 18h48
  2. Prob pour exporter une macro en code VBA
    Par electrosat03 dans le forum Access
    Réponses: 6
    Dernier message: 04/02/2006, 19h15
  3. type de colonne pour numéro de tél et code postal
    Par molesqualeux dans le forum Requêtes
    Réponses: 2
    Dernier message: 19/01/2006, 14h19
  4. pb pour la validité d'un code postal
    Par hoaxpunk dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/12/2005, 11h35
  5. Réponses: 2
    Dernier message: 30/06/2005, 14h58

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