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 :

[Swing] Actualisation d'un composant graphique


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut [Swing] Actualisation d'un composant graphique
    Bonjour,

    Voici donc un problème que je traine depuis trop longtemps ...

    Dans une interface graphique, j'ai besoin de remplacer un composant par une autre instance ...

    Par exemple, j'ai un groupe de radioButtons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    JRadioButton r1 = new JRadioButton("Radio 1");
    JRadioButton r2 = new JRadioButton("Radio 2");
    JRadioButton r3 = new JRadioButton("Radio 3");
     
    r1.setSelected(true);
     
    ButtonGroup bg = new ButtonGroup();
    bg.add(r1);
    bg.add(r2);
    bg.add(r3);
    Je les ajoute à un JPanel P2 ...

    Je souhaite faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    r2 = new JRadioButton("Radio 2 bis");
    et que ce dernier (le BIS) remplace le 2 ...

    Malheureusement cela ne marche pas, mon interface n'est pas mise à jour ... Malgré des revalidate ou repaint (que je ne maitrise pas bien) dans tous les sens !

    Par contre si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    P2.remove(r2);
    r2 = new JRadioButton("Radio 2 bis");
    P2.add(r2);
    Ca marche mais c'est pas propre et pas tres pratique ...

    QUelqu'un peu t'il m'aider svp ?

    Bien sur je souhaite remplacer d'autres objets que des JRadioButtons, mais ils illustrent très bien mon problème ... J'ai d'ailleurs refait un test avec des JRadioButtons seulement dans un frame, avec un ActionListener pour recréer le problème ...

    MErci bcp !

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    A ma connaissance, il n'y a pas de méthode pour 'remplacer' un objet.
    Ce que tu as fait me semble bien à moi .

    J'ai deux mises en gardes:
    - pour l'exemple des radioButton, il faut penser à modifier le buttonGroup aussi
    - il faut bien connaitre le layout utilisé et les objets présents pour que le nouveau remplace effectivement l'ancien (= à la même place)

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Oui c'est exactement ca ... Si tu utilise des FlowLayouts ou des GridLayouts, ben c'est mort ...

    Pis cette technique (si on peu l'appeler comme ca) ne marche pas si mon composant est directement le "RightComponent" d'un JSlplitPane ...

    Si je comprends bien, si je remplace mon composant en mémoire par un nouveau, aucun moyen que JAVA fasse le changement ?

    Grrr

  4. #4
    Membre chevronné Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Points : 2 232
    Points
    2 232
    Par défaut
    Peut être qu'au lieu de remplacer le composant par un autre tu pourrais juste remplacer les propriétés du premier par celle qui sont différentes dans le nouveau. C'est pas forcement trè très propre mais ça pourrait réoudre ton problème

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Je ne veux pas trop m'avancer, mais je pense que t'as bien résumé la situation.

    Ceci dit, j'ai eu à résoudre un problème similaire, et j'ai trouvé une feinte. C'est un peu lourd à mettre en place, et il faut savoir quels objets peuvent être remplacés.

    J'avais à faire une grille dont je pouvait avoir besoin de remplacer les éléments.
    Je m'en suis tiré en faisant un tableau de JPanel. Chaque JPanel représentait une case. Et je mettait les objets dans le JPanel. Donc au moment de remplacer un objet, je récupérais le JPanel qui le contenait, je faisais un removeAll() puis un add().

    Donc en gros, la technique consiste à créér un JPanel par objet remplaçable qui lui ne changera pas.

    Autre risque : se méfier de la mise en page, et bien choisir le Layout du JPanel intermédiaire en conséquence.

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Ok ...

    Modifier propriètés : OUI si objet simple ... Dans mon cas c'est un objet perso assez complexe ...

    TEchnnique du JPanel, j'y avais pensé mais essayait de trouver plus propre ...

    Le cas échéant je vais faire ca ...

    MErci en tous cas !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Ci-dessous un exemple compilable et exécutable.
    L'appui sur le bouton rouge du haut modifie r2.

    Cordialement,

    Nicolas

    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
    // appeler le fichier Exemple089_RemplacerUnRadioButton.java
    // par Nicolas_75
    // le mardi 20 février 2007
    // pour http://www.developpez.net/forums/showthread.php?t=282847
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class Exemple089_RemplacerDynamiquementUnJRadioButton extends JFrame {
     
        // méthode vidant un JPanel, et la remplissant
        // par 3 JRadioButtons passés en paramètres :
        private static ButtonGroup fillWithRadioButtons(JPanel panel, JRadioButton r1, JRadioButton r2, JRadioButton r3) {
            panel.removeAll();
            r1.setSelected(true);
            ButtonGroup bg = new ButtonGroup();
            bg.add(r1);
            bg.add(r2);
            bg.add(r3);
            panel.add(r1);
            panel.add(r2);
            panel.add(r3);
            return bg;
        }
     
        // panel contenant les 3 JRadioButtons :
        private JPanel radioPanel;
     
        // les 2 JRadioButtons "fixes" r1 et r3 :
        private JRadioButton r1;
        private JRadioButton r3;
     
     
        /**
         * Constructeur
         */
        public Exemple089_RemplacerDynamiquementUnJRadioButton() {
     
            // début de la mise en place de la JFrame :
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(new BorderLayout());
     
            // bouton du haut :
            JButton topButton = new JButton("Cliquer ici pour modifier le RadioButton");
            topButton.setForeground(Color.RED);
            topButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    // si on appuie sur le bouton du haut...
                    // création d'un noubeau JRadioButton 2 :
                    JRadioButton r2bis = new JRadioButton("Radio 2bis");
                    // substitution au sein du panel :
                    Exemple089_RemplacerDynamiquementUnJRadioButton.this.fillWithRadioButtons(
                            Exemple089_RemplacerDynamiquementUnJRadioButton.this.radioPanel,
                            r1, r2bis, r3);
                    // mise à jour de l'affichage :
                    Exemple089_RemplacerDynamiquementUnJRadioButton.this.radioPanel.updateUI();
                }
            });
            this.add(topButton, BorderLayout.NORTH);
     
            // groupe de JRadioButtons :
            r1 = new JRadioButton("Radio 1");
            JRadioButton r2 = new JRadioButton("Radio 2");
            r3 = new JRadioButton("Radio 3");
            radioPanel = new JPanel();
            // on remplit le panel avec des JRadioButtons :
            ButtonGroup bg = fillWithRadioButtons(radioPanel, r1, r2, r3);
            this.add(radioPanel, BorderLayout.CENTER);
     
            // fin de la mise en place de la JFrame :
            this.pack();
            this.setLocationRelativeTo(null);  
        }
     
        /**
         * Main de lancement
         * @param args arguments de la ligne de commande, inutilisés ici
         */
        public static void main(String[] args) {
            new Exemple089_RemplacerDynamiquementUnJRadioButton().setVisible(true);
        }
    }

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Okiiiiiiiiiiiiiiii

    Merci bcp Nico ... C'est un peu ce que je pensais faire ...

    en tous cas comme ca suis sur ...

    Merci bcp bcp pour le code ^^

    J'applique ca a mon projet et si Ok je met RESOLU

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2015, 12h16
  2. [swing] Recherche d'un composant graphique
    Par isoman dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 07/04/2009, 22h39
  3. Composant graphique multiple (ou dérivé d'un TFrame)
    Par Jean Bovet dans le forum C++Builder
    Réponses: 5
    Dernier message: 30/04/2007, 18h57
  4. [Composant Graphique] List Box "synchronisés"
    Par Raideman dans le forum C++Builder
    Réponses: 9
    Dernier message: 03/11/2006, 19h50
  5. Composant graphique
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 21/12/2004, 20h03

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