Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modifier ContentPane en cliquant sur un JButton

Sujet résolu
    5 janvier 2009 à 16:04:31

    Bonjour à tous,

    je suis en train de programmer un jeu de bataille navale en java avec swing et awt.

    Ce que j'ai pour le moment :
    - Une fenêtre héritée de JFrame
    - Un PanelAccueil hérité de JPanel
    - Un PanelJeu hérité de JPanel

    Dans mon main je crée ma fenêtre, je lui setContentPane(new PanelAccueil()); j'ai donc mon JPanel d'accueil qui s'affiche avec plusieurs boutons, dont l'un qui devrait lancer la partie.
    Si je setContentPane(new PanelJeu()); j'arrive directement sur l'aire de jeu (avec les grilles de jeux).

    Ce que je souhaiterais faire, c'est que l'un des boutons présents dans le PanelAccueil modifie le ContentPane pour être remplacé par le PanelJeu...

    Voici ma classe de PanelAccueil :
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class PanelAccueil extends JPanel{
    	
    	public PanelAccueil(){
    		
    		super();
    		
    		this.setLayout(new BorderLayout());
    		JPanel sud = new JPanel();
    		sud.setLayout(new FlowLayout());
    		
    		JLabel label = new JLabel("Partez à l'abordage avec Waterworld");
    		label.setHorizontalAlignment(JLabel.CENTER);
    		label.setFont(new Font("Comic sans MS", Font.BOLD, 30));
    		
    		JButton nPartie = new JButton("Nouvelle Partie");
    		JButton rPartie = new JButton("Reprendre Partie");
    		JButton cPartie = new JButton("Charger Partie");
    		
    		nPartie.addActionListener(
    			new ActionListener(){ 
    				public void actionPerformed(ActionEvent e){
    					// Changer le contentPane de fenetreJeu
    					// setContentPane(new PanelJeu());
    				}
    			}
    		);
    		
    		this.add(label, BorderLayout.NORTH);
    		this.add(new JLabel(new ImageIcon("accueil.jpg")), BorderLayout.CENTER);
    		
    		this.add(sud, BorderLayout.SOUTH);
    		sud.add(nPartie);
    		sud.add(rPartie);
    		sud.add(cPartie);
    	}
    }
    


    Et ma classe de main :
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class Waterworld{
    	
    	public static void main(String[] args){
    		
    		Fenetre fenetreJeu = new Fenetre();
    		fenetreJeu.setContentPane(new PanelAccueil());
    		fenetreJeu.setVisible(true);
    	}
    }
    


    Bien entendu, si le setContentPane(new PanelJeu()); est en commentaire, c'est parce-qu'il ne fonctionne pas.
    Voilà, si quelqu'un pourrait m'éclairer sur la manière de procéder pour changer le ContentPane ça serait super ;)

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2009 à 16:54:51

      le setContentPane doit s'appliquer au JFrame.
      Là, sauf erreur de ma part, tu l'appliques à ton PanelAccueil.
      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2009 à 17:52:54

        Merci d'avoir répondu.

        @Nym : J'ai bien pensé à ça, mais je ne vois pas comment je peux l'appliquer au JFrame fenetreJeu qui se situe dans le main...
        Donc existe-t-il une fonction qui permet de retrouver le le JFrame courant ? (j'ai vu qu'il n'y avait pas de getJFrame() dans l'api...)

        @colibri : Pour le CardLayout, j'y ai regardé mais ça ne semble pas convenir, l'idéal serait donc de récupérer le JFrame courant.
        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2009 à 18:04:28

          Citation : anubis002

          Dans mon main je crée ma fenêtre, je lui setContentPane(new PanelAccueil()); j'ai donc mon JPanel d'accueil qui s'affiche avec plusieurs boutons, dont l'un qui devrait lancer la partie.
          Si je setContentPane(new PanelJeu()); j'arrive directement sur l'aire de jeu (avec les grilles de jeux).

          Ce que je souhaiterais faire, c'est que l'un des boutons présents dans le PanelAccueil modifie le ContentPane pour être remplacé par le PanelJeu...


          Au lieu de changer le ContentPane à chaque fois utilises plutôt un CardLayout, qui est bien plus souple et qui convient à ce que tu désires faire.
          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2009 à 19:53:43

            Suivant ton conseil, j'ai employé les CardLayout comme cela dans le main :
            import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            
            public class Waterworld{
            	
            	public static void main(String[] args){
            		
            		Fenetre fenetreJeu = new Fenetre();
            		
            		JPanel game = new JPanel();
            		CardLayout monCardLayout = new CardLayout();
            		game.setLayout(monCardLayout);
            		
            		game.add("accueil", new PanelAccueil());
            		game.add("jeu", new PanelJeu());
            		
            		fenetreJeu.setContentPane(game);
            		fenetreJeu.setVisible(true);
            	}
            }
            


            Dans mon PanelAccueil j'essais donc de changer de carte :
            nPartie.addActionListener(
            	new ActionListener(){ 
            		public void actionPerformed(ActionEvent e){
            			monCardLayout.next(game);
            		}
            	}
            );
            

            Seulement j'ai 2 erreurs (les mêmes que tout à l'heure avec le setContentPane...) avec JCreator : "cannot find symbol" pointant sur la ligne "monCardLayout.next(game)" et cela est dû au fait qu'il ne connait pas le CardLayout "monCardLayout" dans cette classe, idem pour game.

            Je n'arrive pas à supprimer ses erreurs.

            Tentative de résolutions des erreurs :
            J'ai pourtant essayer de créer une nouvelle classe "PanelGame"
            comme cela :
            import javax.swing.*;
            import java.awt.*;
            import java.awt.event.*;
            
            public class PanelGame extends JPanel{
            	
            	static JPanel game = new JPanel();
            	static CardLayout monCL = new CardLayout();
            	
            	public PanelGame(){
            		
            		game.add("accueil", new PanelAccueil());
            		game.add("jeu", new PanelJeu());
            		
            	}
            }
            

            avec un main : tout simple où je fais
            fenetreJeu.setContentPane(new PanelGame());
            

            Le static m'étant imposé par le compilateur. Comme cela ça compile ! Mais par contre je n'ai qu'une fenêtre vide...
            • Partager sur Facebook
            • Partager sur Twitter
              5 janvier 2009 à 21:32:00

              Désolé mais ça marche impec chez moi :
              Image utilisateurImage utilisateur

              voila le code :
              import java.awt.*;
              import javax.swing.*;
              import java.awt.event.*;
              
              public class Fenetre extends JFrame implements ActionListener{
              
              	private CardLayout layout;
              	private JPanel panneauJaune, panneauRouge, conteneurPaneau, conteneurBouton;
              	private JButton suivant, precedent;
              	
              	public Fenetre() {
              		this.setTitle("Blabla");
              		this.setSize(750, 500);
              		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              		this.setLocationRelativeTo(this.getParent());
              
              		layout = new CardLayout();
              
              		conteneurPaneau = new JPanel();
              		conteneurPaneau.setLayout(layout);
              		panneauJaune = new JPanel();
              		panneauJaune.setBackground(Color.yellow);
              		panneauRouge = new JPanel();
              		panneauRouge.setBackground(Color.red);
              		conteneurPaneau.add(panneauRouge, "rouge");
              		conteneurPaneau.add(panneauJaune, "jaune");
              		
              		conteneurBouton = new JPanel();
              		suivant = new JButton("Suivant");
              		suivant.addActionListener(this);
              		precedent = new JButton("Precedent");
              		precedent.addActionListener(this);
              		conteneurBouton.add(suivant);
              		conteneurBouton.add(precedent);
              		
              		this.add(conteneurPaneau);
              		this.add(conteneurBouton, BorderLayout.SOUTH);
              	}
              	
              	public void actionPerformed(ActionEvent e){
              		if(e.getSource() == suivant){
              			layout.next(conteneurPaneau);
              		}
              		if(e.getSource() == precedent){
              			layout.previous(conteneurPaneau);
              		}
              	}
              	
              	public static void main(String[] args) {
              		Fenetre fen = new Fenetre();
              		fen.setVisible(true);
              	}
              
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
                5 janvier 2009 à 21:45:15

                J'ai réussi à faire fonctionner les CardLayout :D

                Merci beaucoup pour ton aide ;)

                Je mets le code final au cas où que quelqu'un autre se trouve dans le même cas de figure que moi.
                Ce que j'ai fait pour que ça fonctionne :
                class du main :
                import javax.swing.*;
                import java.awt.*;
                import java.awt.event.*;
                
                public class Waterworld{
                	
                	static JPanel game = new JPanel();
                	static CardLayout monCL = new CardLayout();
                	
                	public static void main(String[] args){
                		
                		Fenetre fenetreJeu = new Fenetre();
                		
                		game.setLayout(monCL);
                		
                		game.add("accueil", new PanelAccueil());
                		game.add("jeu", new PanelJeu());
                
                		fenetreJeu.setContentPane(game);
                		fenetreJeu.setVisible(true);
                	}
                }
                

                ActionListener de la class PanelAccueil :
                nPartie.addActionListener(
                	new ActionListener(){ 
                		public void actionPerformed(ActionEvent e){
                			Waterworld.monCL.next(Waterworld.game);
                		}
                	}
                );
                
                • Partager sur Facebook
                • Partager sur Twitter

                Modifier ContentPane en cliquant sur un JButton

                × 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