Partage
  • Partager sur Facebook
  • Partager sur Twitter

Interchanger des JPanel

    1 octobre 2010 à 11:20:28

    Bonjour à tous !

    Le problème est assez simple mais je n'arrive pas à le résoudre, malgré des heures de recherche sur le net !

    Dans une fenêtre, on considère un PanneauPrincipal dans lequel on place un bouton. On crée un événement de type ActionListener. Dedans je déclare un panneau : Panneau2 puis je fais sa classe, mais impossible de l'afficher ...

    Voici un code simplifié :

    Merci d'avance !!

    public class menu
    {
    	public static void main(String []args)
    	{
    		cadre fenetre = new cadre("Fenetre 1",150,150,1365,718);
    	}
    }
    
    class cadre extends JFrame
    {
    	public cadre(String nom,int X,int Y,int H,int L)
    	{
    		super(nom);
    		setBounds(X,Y,H,L);
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		getContentPane().add(new PanneauPrincipal());
    		setVisible(true);
    		setResizable(false);
    	}
    }
    
    class PanneauPrincipal extends JPanel                                       
    {
    	private JButton jouer = new JButton("Jouer");
    		
    	public PanneauPrincipal()
    	{
                   add(jouer);
                   jouer.addActionListener(new Ecouteur1());
            }
    
            class Ecouteur1 implements ActionListener
    	{
    		public void actionPerformed(ActionEvent evt)
    		{	
    		        setVisible(false);  //La commande : PanneauPrincipal.setVisible(false); ne fonctionne pas :S
                            JPanel Panneau2 = new JPanel();
                            Panneau2.setVisible(true);
    			class Panneau2 extends JPanel
    			{
                                 // Ici peu importe, on rajoute des objet ; JButton etc ...
                            }
                     }
             }
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      1 octobre 2010 à 11:35:10

      salut,
      ton problème viens du faite que tu n'ajoute pas ton panel a ton jframe ou a ton autre panel juste tu le crée dans le vide.

      J'ai quelques remarques :

      - quel est l'interet de ta classe cadre car la seul chose qu'elle fait est etendre un jframe et mettre un petit setup.
      -> ne serait-il pas plus pertinent de faire dans ton main ?
      JFrame fenetre = new JFrame("Fenetre1");
          fenetre.setBounds(150,150,1365,718);
          fenetre.setDefaultCloseOperation(EXIT_ON_CLOSE);
          fenetre.getContentPane().add(new PanneauPrincipal());
          fenetre.setVisible(true);
          fenetre.setResizable(false);
      


      - pourquoi faire un écouteur en class interne, autant faire un écouteur anonyme non ?
      jouer.addActionListener(new ActionListener(){
               public void actionPerformed(ActionEvent evt){
                   actionPerfomed();
               }
          });
          public void actionPerformed(){
               //ton code de l'action
          }
      

      • Partager sur Facebook
      • Partager sur Twitter
        1 octobre 2010 à 15:48:46

        Merci pour les remarques ! Je vais en tenir compte. En effet, cela est plus pratique.

        Pour le changement de panneau, il me semblait bien que c'était un problème de ce genre, mais je ne vois pas comment l'appliquer a ma fenetre JFrame ...

        Faut-il utiliser une méthode du type :
        setContentPane() ?
        ou getContentPane() ?

        Merci d'avance !
        • Partager sur Facebook
        • Partager sur Twitter
          1 octobre 2010 à 15:58:36

          normalement tu devrai faire un truc genre:

          JFrame fenetre = new JFrame();
          fenetre.add(tonPanel);
          //ou 
          fenetre.getContentPane().add(tonPanel);
          


          mais si tu ajoutes des éléments dans ta frame et même dans un panel n'oublie pas de "setter" le layout pour que les éléments se place comme tu le souhaite.
          • Partager sur Facebook
          • Partager sur Twitter
            1 octobre 2010 à 16:09:53

            Aucune des deux méthodes ne fonctionne ... Disons qu'il n'y a aucune erreur de compilation mais quand je clique sur le bouton rien ne se passe ...
            • Partager sur Facebook
            • Partager sur Twitter
              1 octobre 2010 à 16:10:55

              peux tu montrer ton nouveau code ?
              sa sera plus simple.
              • Partager sur Facebook
              • Partager sur Twitter
                1 octobre 2010 à 16:21:59

                bonjour, pour ajouter un panneau à une JFrame, ce qui est obligatoire, c'est :
                setContentPane(panneau); // --- L'ajout du panneau à la JFrame
                

                vers la fin du constructeur.
                De plus je verrais ça comme ça. On ajouter un panneau au principal et on swappe quand on le veut avec un autre panneau déjà existant en jouant sur setVisible(b).
                • Partager sur Facebook
                • Partager sur Twitter
                  1 octobre 2010 à 16:34:00

                  Pour le setContentPane il veut pas me le prendre ... il me met :
                  essai.java:139: cannot find symbol
                  symbol : method Panneau2()
                  location: class PanneauPrincipal.Ecouteur1
                  setContentPane(Panneau2());



                  voici le code :

                  import javax.swing.*;
                  import java.awt.*;
                  import java.awt.event.*;
                  import javax.sound.midi.*;
                  
                  
                  
                  public class essai
                  {
                  	public static void main(String []args)
                  	{
                  		cadre fenetre = new cadre("Fenetre 1",150,150,1365,718);
                  	}
                  }
                  
                  class cadre extends JFrame
                  {
                  	public cadre(String nom,int X,int Y,int H,int L)
                  	{
                  		super(nom);
                  		setBounds(X,Y,H,L);
                  		setDefaultCloseOperation(EXIT_ON_CLOSE);
                  		getContentPane().add(new PanneauPrincipal());
                  		setVisible(true);
                  		setResizable(false);
                  	}
                  }
                  
                  class PanneauPrincipal extends JPanel                                       
                  {
                  	private JButton jouer = new JButton("Jouer");
                  		
                  	public PanneauPrincipal()
                  	{
                                 add(jouer);
                                 jouer.addActionListener(new Ecouteur1());
                          }
                  
                          class Ecouteur1 implements ActionListener
                  	{
                  		public void actionPerformed(ActionEvent evt)
                  		{	
                  		     JFrame fenetre = new JFrame();
                  			JPanel Panneau2 = new JPanel();
                  			setContentePane(Panneau2);
                  			fenetre.getContentPane().add(Panneau2); 
                  			
                  						
                  			class Panneau2 extends JPanel
                  			{
                                            
                                             setBackground(Color.black);
                                          }
                                   }
                           }
                  }
                  



                  PS je corrigerai tes remarques après ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 octobre 2010 à 16:44:27

                    attention, regarde bien se que tu fais :o

                    dans ton action listener tu créer une nouvelle frame alors que d'apres se que j'ai compris tu veux le mettre sur ta frame qui existe déjà!

                    voila une petite soluce mais j'ai pas testé donc dis moi si il y a encore des bugs.


                    import javax.swing.*;
                    import java.awt.*;
                    import java.awt.event.*;
                    import javax.sound.midi.*;
                    
                    
                    
                    public class essai
                    {
                    	public static void main(String []args)
                    	{
                    		cadre fenetre = new JFrame("Fenetre 1");
                    		fenetre.setBounds(X,Y,H,L);
                    		fenetre.setDefaultCloseOperation(EXIT_ON_CLOSE);
                    		fenetre.add(new PanneauPrincipal());
                    		fenetre.setVisible(true);
                    		fenetre.setResizable(false);
                    	}
                    }
                    
                    class PanneauPrincipal extends JPanel {
                    	private JButton jouer = new JButton("Jouer");
                    		
                    	public PanneauPrincipal() {
                    	   add(jouer);
                    	   jouer.addActionListener(new ActionListener(){
                    			public void actionPerformed(ActionEvent evt) {	
                    		               jouerClick();
                    			}
                    	   });
                    	}
                    	
                    	public void jouerClick(){
                    		this.add(new Panneau2());
                    		this.invalidate();
                    		this.validate();
                    		this.repaint():
                    	}
                    }
                    
                    
                    class Panneau2 extends JPanel{                          
                       setBackground(Color.black);
                    }
                    

                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 octobre 2010 à 16:47:26

                      pour faire court (+ la void + les imports + les agenceurs):
                      public class SwingSwap extends JFrame
                      {
                        JPanel panneau  = new JPanel();
                        JPanel panneau1 = new JPanel();
                        JPanel panneau2 = new JPanel();
                        JButton cbSwap1 = new JButton("Swap1");
                        JButton cbSwap2 = new JButton("Swap2");
                      
                        public SwingSwap()
                        {
                          setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
                          panneau1.add(cbSwap1);
                          panneau2.add(cbSwap2);
                          panneau.add(panneau1);
                          panneau.add(panneau2);
                          panneau2.setVisible(false);
                          setContentPane(panneau);
                          setVisible(true);
                          pack();
                          cbSwap1.addActionListener(new ActionListener()
                          {
                             public void actionPerformed(ActionEvent e)
                             {
                                panneau1.setVisible(false);
                                panneau2.setVisible(true);
                             }
                          });
                      }
                      }
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 octobre 2010 à 16:49:46

                        oui en effet c'est plus propre! :p
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 octobre 2010 à 17:05:59

                          Ligarnes, c'est déja beaucoup mieux !
                          Quand je le fais sur le petit programme de test, j'observe un carré noir juste a coté du bouton jouer, est ce normal ?

                          Quand j'applique la même méthode sur mon gros programme, rien ne se passe ... A savoir qu'il y a une image en fond d'écran qui cache peut etre le 2eme panneau ... ???
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 octobre 2010 à 18:09:59

                            Ben se que j'ai fait moi c'est juste ajouté un nouveau panel a ton panel principale.

                            par contre si tu veux faire un echange de panel tu peu faire comme montré par sicilien007.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 octobre 2010 à 18:35:08

                              Merci !

                              voici un extrait de mon code que j'ai modifié grâce aux explications de Silence007.
                              Disons que ce que j'ai ajouté est correct (aucune erreur de compilation).
                              Mais ca ne fait rien ... Juste le carré noir a coté du bouton jouer.

                              Merci beaucoup pour vos aides !

                              import javax.swing.*;
                              import java.awt.*;
                              import java.awt.event.*;
                              import javax.sound.midi.*;
                              
                              
                              
                              public class essai
                              {
                              	public static void main(String []args)
                              	{
                              		cadre fenetre = new cadre("Fenetre 1",150,150,1365,718);
                              	}
                              }
                              
                              class cadre extends JFrame
                              {
                              	public cadre(String nom,int X,int Y,int H,int L)
                              	{
                              		super(nom);
                              		setBounds(X,Y,H,L);
                              		setDefaultCloseOperation(EXIT_ON_CLOSE);
                              		getContentPane().add(new PanneauPrincipal());
                              		setVisible(true);
                              		setResizable(false);
                              	}
                              }
                              
                              class PanneauPrincipal extends JPanel 
                              {
                              	private JButton jouer = new JButton("Jouer");
                              		
                              	public PanneauPrincipal() 
                              	{
                              	   add(jouer);
                              	   jouer.addActionListener(new ActionListener()
                              	   {
                              			public void actionPerformed(ActionEvent evt)
                              			{	
                              		               jouerClick();
                              			}
                              	   });
                              	}
                              	
                              	public void jouerClick(){
                              		this.add(new Panneau2());
                              		this.invalidate();
                              		this.validate();
                              		this.repaint();
                              	}
                              }
                              
                              class Panneau2 extends JPanel
                              {                          
                              	public Panneau2()
                              	{
                              	   setBackground(Color.black);
                              	}
                              }
                              
                              class SwingSwap extends JFrame
                              {
                                JPanel Panneau2  = new JPanel();
                                JPanel Panneau  = new JPanel();
                                JButton cbSwap1 = new JButton("Swap1");
                                  public SwingSwap()
                                  {
                                  		Panneau2.add(cbSwap1);
                                  		Panneau.add(Panneau2);
                                  		Panneau2.setVisible(false);
                                  		setContentPane(Panneau);
                                  		setVisible(true);
                                  		pack();
                                  		cbSwap1.addActionListener(new ActionListener()
                                  		{
                                     		public void actionPerformed(ActionEvent e)
                                     		{
                                        		Panneau2.setVisible(true);
                                     		}
                                  		});
                              
                                  }
                                
                              }
                              
                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 octobre 2010 à 19:36:12

                                je te conseil de regarder un peu plus des tutoriels sur le swing et le java car la il faudrait qu'on te fasse le code au complet. sa me dérange d'aidé mais la il te manque les bases.

                                Bonne chance!
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 octobre 2010 à 19:41:26

                                  Ouai ok ! On ne nous a pas enseigné le JAVA de la même facon que sur le forum ...
                                  Je trouve ca assez bizarre les tutos mais bon, tant pis !

                                  Je vais voir si je peux me débrouiller !

                                  Ciao et merci !!



                                  Et si t'as rien a faire je suis tout de même preneur pour un code =D
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 octobre 2010 à 12:15:02

                                    Désolé de vous redéranger, mais j'ai étudié un peu comment interchanger les JPanel, et impossible de trouver une méthode qui fonctionne ...

                                    Pour l'instant j'ai ce type de code :

                                    option.addActionListener(new ActionListener()
                                    	     {
                                    			public void actionPerformed(ActionEvent evt)
                                    			{	
                                    				optionClick();
                                    			}
                                    	     });
                                    		
                                    	}
                                    	
                                    	public void optionClick()
                                    	{
                                    		this.removeAll();       // ca supprime tous les objet de mon Pan Principal
                                    		this.add(new PanneauOption());
                                    		this.invalidate();
                                    		this.validate();
                                    		this.repaint();
                                    	}
                                    


                                    J'ai essayé d'utiliser la méthode JLayeredPane, mais le panneauOption ne s'affiche pas non plus ... Une idée ??

                                    Merci d'avance !
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      3 octobre 2010 à 12:21:18

                                      un ptit conseil tu peux utilisé revalidate qui fait pour toi le invalidate et validate et normalement ton repaint et inutile aussi.
                                      sinon désolé je connais pas trop les LayeredPane mais il me semble qu'il ne corresponde pas tout a fait se que tu veux faire : tutoriel oracle
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 octobre 2010 à 17:15:58

                                        J'ai regardé je peux pas remplacer les trois méthodes pas le revalidate ;)

                                        Il me reste juste a ajouter ou a rendre visible le panneau2
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          3 octobre 2010 à 21:39:02

                                          Hmmm et pourquoi ne pas utiliser tout simplement le Cardlayout ?

                                          Tu met tout t'es panels dedans et tu fais un petit cardmanager.next() dans le actionPerformed.
                                          tu te casse la tete pour rien ( sauf si j'ai rater un truc )...

                                          ( je te laisse cherche google pour plus d'info )
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Interchanger des JPanel

                                          × 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