Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer un JPanel d'un simple clic

Sujet résolu
    25 mai 2009 à 18:54:52

    Bonjour. Tout est dans le titre.

    J'ai une fenêtre, constituée d'un gridLayout de deux lignes, avec en première ligne un JPannel nommé panHaut qui pointe vers un objet PanA. Je voudrais que d'un simple clic sur le bouton "Alterner" ... panHaut pointe vers PanB au lieu de PanA... et que l'affichage s'en fasse evidemment ressentir.

    Voici un programme simple pour illustrer mon problème :


    Main.java :


    public class Main {
    
        public static void main(String[] args) {
            new Fenetre();
        }
    
    }
    


    Fenetre.java
    public class Fenetre extends JFrame {
        JPanel panHaut;
        JButton boutonSwitch;
        Fenetre() {
            this.getContentPane().setLayout(new GridLayout(2, 1));
            panHaut = new PanA();
            this.getContentPane().add(panHaut);
            
            boutonSwitch = new JButton("Alterner");
            boutonSwitch.addActionListener(new BoutonSwitchListener());
            this.getContentPane().add(boutonSwitch);
            
            this.setVisible(true);
        }
        
        protected void setPanHaut(JPanel pan) {
            this.panHaut = pan;
            this.validate();
            this.repaint();
        }
        
        class BoutonSwitchListener implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
                setPanHaut(new PanB());
            }
            
        }
    }
    


    PanA.java
    public class PanA extends JPanel {
    
        public PanA() {
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            g.drawString("Je suis dans PanA", 20, 50);
            
            
        }
    }
    


    PanB.java
    public class PanB extends JPanel {
    
        @Override
        protected void paintComponent(Graphics g) {
            g.drawString("Je suis dans PanB", 40, 60);
            
            
        }
    }
    


    Or... rien ne se passe graphiquement lorsque l'on clique sur le bouton Alterner... Pourtant avec des tests en println on voit bien que la méthode est appelée.

    Quelqu'un pourrait-il m'éclairer à ce propos ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2009 à 19:25:23

      Tu changes ta variable panHaut que tu as défini toi même. Son adresse pointe bien sur ton panneauB. Par contre ta JFrame elle n'affiche pas panHaut mais ce qu'il y a dans ton getContentPane.add()...

      Je te mets pas le code solution et te laisse réfléchir. Si tu arrives toujours pas reviens.
      • Partager sur Facebook
      • Partager sur Twitter
        25 mai 2009 à 20:02:57

        Je suis d'accord avec le fait que si je change l'adresse sur laquelle pointe à la base panHaut, le panel ne pourra pas accéder à l'adresse fournie par "new PanA()". Ma fonction setPanHaut est donc bidon.

        Une solution barbare pourrait être de retirer tous les panels et de les ré-ajouter en changeant PanA par PanB... mais c'est nul.

        Il me faudrait un moyen d'accéder à l'ensemble des composants ajoutés au panel principal de la fenêtre, et de pouvoir modifier l'adresse d'un en particulier... Mais je n'ai rien trouvé dans la doc qui me permettrait de faire ça.

        • Partager sur Facebook
        • Partager sur Twitter
          25 mai 2009 à 20:21:08

          Et la seule solution propre qui existe c'est de supprimer panHaut du contentPane et d'ajouter ton nouveau panHaut au contentPane.
          • Partager sur Facebook
          • Partager sur Twitter
            25 mai 2009 à 20:30:31

            Via la méthode remove ? Je vais voir ça.

            • Partager sur Facebook
            • Partager sur Twitter
              25 mai 2009 à 20:46:28

              Bon la prochaine fois que tu viendras si tu as pas encore la solution, la voici :
              protected void setPanHaut(JPanel pan) {
                  this.getContentPane().remove(panHaut);
                  this.panHaut = pan;
                  this.getContentPane().add(panHaut);
                  this.validate();
                  this.repaint();
              }
              


              Bon par contre faudra peut-être légèrement modifier le add à cause de GridLayout.
              • Partager sur Facebook
              • Partager sur Twitter
                26 mai 2009 à 10:51:08

                Oui effectivement, ça décale tout.

                Je trouve un peu ça barbare mais bon, s'il n'y a pas d'autres solutions... je vais devoir supprimer tous les panels existants puis les ré-ajouter tous.

                Je vais voir tout ça.

                Merci beaucoup pour ton aide.
                • Partager sur Facebook
                • Partager sur Twitter

                Changer un JPanel d'un simple clic

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown