Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changer de JPanel sans changer de fond

    2 décembre 2016 à 17:56:50

    Bonjour,

    J'écris un message sur le forum car malgré mes recherches je ne trouve pas de solution à mon problème.

    Je possède une fenêtre (JFrame) dans laquelle se trouve un JPanel contenant un fond (image assez lourde à charger). Je mets par dessus un autre panel contenant mes composants (en l'occurrence des boutons) avec la propriété opaque valantfalse. Je voudrai pouvoir modifier le panel contenant les composant et recharger celui-ci sans avoir à recharger l'image de fond.

    public class PanneauFond extends JPanel {
    
    	private BufferedImage img;
    	private Fenetre fenetre;
    	private JPanel panneau;
    	
    	public PanneauFond(Fenetre fenetre) {
    		this.fenetre = fenetre;
    		this.panneau = new PanneauAccueil(fenetre);
    			
    		this.add(this.panneau);
    	}
    	
    	public void paintComponent(Graphics g) { 	
    		try {
    			img = ImageIO.read(new File("Fond2.jpg"));
    			g.drawImage(img, 0, 0,  fenetre.getSize().width,  fenetre.getSize().height, 0, 0, img.getWidth(), img.getHeight(), null); 
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void actualiserContenu(){
    		this.panneau.revalidate();
    		this.panneau.repaint();
    	}
    }


     Le contenu est modifié au clique sur un bouton, qui déclenche l'action suivante :

    	public ChargerPageAction(Fenetre fenetre, String nomPanneau){
    		this.nomPanneau = nomPanneau;
    		this.fenetre = fenetre;
    		
    	}
    	
    	public void actionPerformed(ActionEvent arg0) {
    		panneau = null;
    		
    		if(this.nomPanneau.equals("Jouer")){
    			panneau = new PanneauJouer(fenetre);
    		} else if(this.nomPanneau.equals("Retour")){
    			panneau = new PanneauAccueil(fenetre);
    		}
    		
    		
    		if(this.panneau != null){
    			fenetre.setPanneauConteneur(panneau);
    		}
    		
    	}
    }

    Par ailleurs voici ma classe Fenetre (JFrame) : 

    public class Fenetre extends JFrame{
    
    	private PanneauFond panneau;
    	
    	public Fenetre(){
    		this.panneau = new PanneauFond(this);
    		this.setTitle("Titre");
    		this.setSize(1920, 1080);
    		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		this.setUndecorated(true);
    		this.setLocationRelativeTo(null);
    		this.getContentPane().add(this.panneau);
    		this.setVisible(true);
    		
    	}
    	
    	public void setPanneauConteneur(JPanel panneau){
    		this.panneau.setPanneau(panneau);
    		this.panneau.actualiserContenu();
    	}
    }

    En espérant que mon problème est clair, n'hésitez pas pour toute demande d'explications supplémentaires

    Merci d'avance 

    Maxime



    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2016 à 18:44:48

      Bonsoir,

      Déjà placer :

              try {
                  img = ImageIO.read(new File("Fond2.jpg"));
              } catch (IOException e) {
                  e.printStackTrace();
              }

      dans le constructeur (il serait mieux d'utiliser des ressources d'images).

      L'image sera chargée qu'une seule fois dans la ram.

      public class PanneauFond extends JPanel {
       
          private BufferedImage img;
          private Fenetre fenetre;
          private JPanel panneau;
           
          public PanneauFond(Fenetre fenetre) {
              try {
                  img = ImageIO.read(new File("Fond2.jpg"));
              } catch (IOException e) {
                  e.printStackTrace();
              }
              this.fenetre = fenetre;
              this.panneau = new PanneauAccueil(fenetre);
                   
              this.add(this.panneau);
          }
           
          @Override
          public void paintComponent(Graphics g) {   
              if(img!=null) g.drawImage(img, 0, 0,  fenetre.getSize().width,  fenetre.getSize().height, 0, 0, img.getWidth(), img.getHeight(), null);
          }
           
          public void actualiserContenu(){
              this.panneau.revalidate();
              this.panneau.repaint();
          }
      }

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter
        3 décembre 2016 à 16:17:22

        Ok merci, 

        Je vais regarder cela.

        • Partager sur Facebook
        • Partager sur Twitter

        Changer de JPanel sans changer de fond

        × 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