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

Interfaces Graphiques en Java Discussion :

Problème contenu de Panel modifié non affiché


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 55
    Points : 38
    Points
    38
    Par défaut Problème contenu de Panel modifié non affiché
    Bonjour,

    ma fenêtre est une JFrame composée de JPanel.

    J'ai 2 Panels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        panel_launch = createPanelLaunch(im_error, im_warn);	       
    	      panel_opt = createPanelOpt();
                 panel_tmp = panel_launch;
                 // On ajoute le panel au panel principal
    	      panel_table.add(panel_tmp,BorderLayout.CENTER);
    Ensuite si on a appuie sur le bouton je veux afficher dans mon panel, le panel "panel_opt". Donc je fais comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    else if (source.equals("Options")){ 
     
    			panel_tmp = panel_opt;
    			panel_table.revalidate();
    			frame.repaint();
     
    	}
    Le problème est que ça ne change rien à l'écran (je vois toujours le panel_launch).

    Pour info:

    public JPanel panel_table ;
    public Component panel_tmp ;
    public Component panel_launch ;
    public Component panel_opt ;

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,

    en effet, ce que tu fais n'est pas très utile et ne risque pas de marcher. Je ne t'explique pas parce qu'il faudrait parler références (pointeurs) et que j'ai la flemme, mais ceci marchera mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    panel_table.remove(panel_tmp);
    panel_table.add(panel_opt, BorderLayout.CENTER);
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    En effet c'est ce que j'ai fais et ça marche.

    Pour ceux que ça pourrait intéressé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                   panel_table.remove(panel_tmp);
    			panel_tmp = panel_opt;
    			panel_table.add(panel_tmp);
    Si jamais l'envie te prend de m'expliquer (avec pointeur) pourquoi ça ne marchait pas.

    Pour info, tous mes panels sont des attributs de ma classe classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class Appli_qualite implements ActionListener {
    }

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Sargon
    Si jamais l'envie te prend de m'expliquer (avec pointeur) pourquoi ça ne marchait pas.
    Tout simplement parce que lorsque tu modifies une référence (on parle de référence plutôt que de pointeur), tu ne modifies QUE cette référence, et en aucun cas des copies de cette référence dans d'autres classes...

    a++

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Ok donc, malgré que mes panels soient des attributs de ma classe princip.

    Lorsqu'un panel en comprend un autre, au lieu de faire un lien vers l'attribut panel, il recopie le panel.

    Merci,

    Sargon

  6. #6
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    en fait, tu disposes de 3 pointeurs :
    - un vers l'objet panel_table
    - un vers l'objet panel_tmp
    - un vers l'objet panel-opt

    panel_table dispose de 1 pointeur vers panel_tmp, et il sait que c'est son fils et qu'il doit l'afficher (très simplifié).

    Quand tu fais simplement, panel_tmp = panel_opt, tu agis sur tes pointeurs à toi, mais pas sur celui de panel_table qui ne change rien, puisque tu ne lui as rien demandé.
    Pour lui dire de changer l'objet au bout de son pointeur, tu utilises add et remove. C'est une variable privée, et tu ne peux la manipuler qu'au travers de méthodes publiques.

    Lorsqu'un panel en comprend un autre, au lieu de faire un lien vers l'attribut panel, il recopie le panel.
    Non, il recopie le pointeur, ce qui est plus efficace, mais qui pose le même problème dans ton cas.

    Ca permet entre autres de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JPanel p = new JPanel(new GridLayout(1, 2);
    JLabel l = new JLabel("salut");
    p.add(l);
    l = new JLabel("ca va ?");
    p.add(l);
    Lorsque je réaffecte une nouvelle valeur à l, cela n'écrase pas en mémoire l'objet précédent (sur lequel p garde un pointeur), et ça en crée un nouveau.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

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

Discussions similaires

  1. Champ type de contenu non affiché dans les listes en création
    Par lflorca dans le forum Développement Sharepoint
    Réponses: 1
    Dernier message: 23/10/2012, 10h54
  2. Problème contenu non cliquable
    Par verbist.raynald dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 20/02/2011, 12h54
  3. Réponses: 6
    Dernier message: 24/11/2009, 12h43
  4. Réponses: 2
    Dernier message: 14/01/2008, 17h32
  5. [CR 9] Mise en forme non affichée when null
    Par Yorglaa dans le forum Formules
    Réponses: 2
    Dernier message: 28/06/2004, 17h27

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