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

AWT/Swing Java Discussion :

Ajout/suppression "dynamique" d'un champ


Sujet :

AWT/Swing Java

  1. #1
    6ix
    6ix est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Ajout/suppression "dynamique" d'un champ
    Bonjour,

    Je n'ai jusque-là pas réussi de trouver une solution claire à mon problème, qui est le suivant: dans un JPanel, je souhaiterais pouvoir créer/supprimer "à la volée" des champs, puis ensuite récupérer leur contenu.

    Exactement comme la définition de règles d'une liste de lecture intelligente dans iTunes, à savoir un champ, puis sur la droite un bouton "-" et un bouton "+".

    Afin d'aller plus dans les détails, mes problèmes se situent surtout à 2 niveaux:
    - comment "regrouper" ces champs et boutons, pour pouvoir traiter leur événement?
    - comment redessiner proprement le panel (uniquement celui-ci, si possible, pas toute la fenêtre) lors d'un événement d'ajout/suppression?

    Merci beaucoup pour votre aide!

  2. #2
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    Par défaut
    Pour ta deuxième question, il suffit d'utiliser, une fois tes suppressions terminées, la commande suivante :
    cela aura pour effet de redessiner "monPanel" et non toute la fenêtre.

    Pour ton 2e problème, je ne suis pas sur de bien comprendre. c'est un champ sélectionné dans une liste ou un composant que tu souhaite ajouter/supprimer ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Points : 216
    Points
    216
    Par défaut
    Il y a aussi la solution de rendre visibles/invisibles les composants plutôt que de les ajouter/supprimer, ça peut simplifier le problème.

    Si ce sont les ajouts/suppression que tu privilégies, c'est validate() qu'il faut utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    panel.remove(mycomponent1);
    panel.add(mycomponent2);
    panel.validate();
    Fred
    Fred

  4. #4
    6ix
    6ix est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par kwxyz Voir le message
    Il y a aussi la solution de rendre visibles/invisibles les composants plutôt que de les ajouter/supprimer, ça peut simplifier le problème.
    Jouer sur la visibilité d'un composant signifie que celui-ci est déjà créé; or ici ce n'est pas le cas. Un clic sur le bouton "+" permet vraiment de rajouter une ligne contenant un champ.

    Désolé si ce n'est pas super clair, mais encore une fois, le système est exactement le même que dans les listes de lectures intelligentes d'iTunes (désolé si vous ne l'avez pas...).

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Une proposition de code, à adapter à ton cas :
    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
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    public class FieldCreator extends JPanel implements ActionListener,
            ContainerListener {
     
        private JTextField tf = new JTextField(20);
     
        private JComponent receiver;
     
        private Set names = new HashSet();
     
        public FieldCreator(JComponent receiver) {
            this.receiver = receiver;
            receiver.addContainerListener(this);
     
            setBorder(BorderFactory.createTitledBorder("Nouveau champ"));
            JLabel label = new JLabel("Intitulé");
            label.setLabelFor(tf);
            JButton plus = new JButton("+");
            plus.addActionListener(this);
            add(label);
            add(tf);
            add(plus);
        }
     
        public void actionPerformed(ActionEvent e) {
            String name = tf.getText();
            if (name.length() == 0) {
                JOptionPane.showMessageDialog(this, "Veuillez saisir un intitulé",
                        "Erreur", JOptionPane.ERROR_MESSAGE);
            } else if (names.contains(getObfuscatedName(name))) {
                JOptionPane
                        .showMessageDialog(this, "L'intitulé '" + name
                                + "' est déjà utilisé", "Erreur",
                                JOptionPane.ERROR_MESSAGE);
            } else {
                RemovableField rf = new RemovableField(name);
                rf.setName(getObfuscatedName(name));
                receiver.add(rf);
                receiver.revalidate();
            }
        }
     
        public void componentAdded(ContainerEvent e) {
            names.add(e.getChild().getName());
        }
     
        public void componentRemoved(ContainerEvent e) {
            names.remove(e.getChild().getName());
        }
     
        private String getObfuscatedName(String name) {
            return "###" + name + "###";
        }
    }
     
    public class RemovableField extends JPanel implements ActionListener {
     
        private String ident;
     
        private JTextField tf = new JTextField(20);
     
        public RemovableField(String ident) {
            this.ident = ident;
            JLabel label = new JLabel(ident);
            label.setLabelFor(tf);
            JButton minus = new JButton("-");
            minus.addActionListener(this);
            add(label);
            add(tf);
            add(minus);
        }
     
        public void actionPerformed(ActionEvent e) {
            Container parent = getParent();
            if (parent != null) {
                parent.remove(this);
                if (parent instanceof JComponent) {
                    ((JComponent) parent).revalidate();
                } else {
                    parent.validate();
                }
                parent.repaint();
            }
        }
     
        public String getIdent() {
            return ident;
        }
     
        public String getValue() {
            return tf.getText();
        }
    }
     
    public class RemovableFieldUtils {
     
        private Container c;
     
        public RemovableFieldUtils(Container c) {
            this.c = c;
        }
     
        public Iterator getRemovableFieldIterator() {
            return new RemovableFieldIterator();
        }
     
        public String getRemovableFieldValue(String ident) {
            Iterator it = getRemovableFieldIterator();
            while (it.hasNext()) {
                RemovableField rf = (RemovableField) it.next();
                if (rf.getIdent().equals(ident)) {
                    return rf.getValue();
                }
            }
            return null;
        }
     
        public String getAllRemovableFieldValues() {
            StringBuffer sb = new StringBuffer();
            Iterator it = getRemovableFieldIterator();
            while (it.hasNext()) {
                RemovableField rf = (RemovableField) it.next();
                sb.append(rf.getIdent()).append("=").append(rf.getValue()).append(
                        "\n");
            }
            return sb.toString();
        }
     
        private class RemovableFieldIterator implements Iterator {
            Stack sp = new Stack();
     
            Object next;
     
            boolean hasNext;
     
            RemovableFieldIterator() {
                sp.push(Arrays.asList(c.getComponents()).iterator());
                hasNext = skip();
            }
     
            private boolean skip() {
                loop: while (!sp.isEmpty()) {
                    Iterator it = (Iterator) sp.peek();
                    while (it.hasNext()) {
                        next = it.next();
                        if (next instanceof RemovableField) {
                            return true;
                        } else if (next instanceof Container) {
                            sp.push(Arrays.asList(
                                    ((Container) next).getComponents()).iterator());
                            continue loop;
                        }
                    }
                    sp.pop();
                }
                return false;
            }
     
            public void remove() {
            }
     
            public boolean hasNext() {
                return hasNext;
            }
     
            public Object next() {
                if (!hasNext) {
                    throw new NoSuchElementException();
                }
                Object rv = next;
                hasNext = skip();
                return rv;
            }
        }
     
        public static void main(String[] args) {
            JFrame f = new JFrame ();
            Container cp = f.getContentPane();
            JPanel receiver = new JPanel();
            final RemovableFieldUtils rfu = new RemovableFieldUtils(receiver);
            receiver.setLayout(new BoxLayout(receiver, BoxLayout.Y_AXIS));
            cp.add(new JScrollPane(receiver));
            cp.add(new FieldCreator(receiver), BorderLayout.NORTH);
     
            final JTextArea ta = new JTextArea(40, 20);
            cp.add(ta, BorderLayout.EAST);
            JButton button = new JButton("Valeurs");
            button.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    ta.setText(rfu.getAllRemovableFieldValues());
                }
            });
            cp.add(button, BorderLayout.SOUTH);
     
            f.setSize(600, 400);
            f.setVisible(true);
        }
    }

  6. #6
    6ix
    6ix est déconnecté
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, je vais tester ça! J'avais également éventuellement pensé à une JTable, en redéfinissant le renderer et tout ce qu'il faut, mais je vais d'abord tester cette solution.

    [EDIT] J'ai réussi à faire ce que je voulais en adaptant ce code, merci bien!

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

Discussions similaires

  1. [AJAX] ajout / suppression champs ( dynamiquement ) dans une page web
    Par anwar1987 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/03/2009, 18h37
  2. Ajout/Suppression dynamique de champs
    Par hedgehog dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/04/2008, 10h57
  3. [xsl]simuler le mecanisme OO de "liaison dynamique"
    Par philemon_siclone dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 19/12/2003, 11h34

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