Superposition image et boutons + texte [Résolu]

cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 02:34 - Dernière réponse : cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention
- 20 janv. 2012 à 07:45
Bonjour à tous !

Voila quelques heures que je suis mit à mal par un problème que je n'arrive pas à résoudre

Je m'explique :
Je dispose d'une image à placer dans mon application java.
Je souhaite ajouter des boutons et du texte par dessus cette image : comment dois-je procéder ?

Dois-je créer deux conteneurs JLayeredPane avec d'un côté mon image et de l'autre mes boutons + mon texte ?
Si oui comment faire en sachant que j'ai déjà un JPanel() actif sur l'ensemble de ma fenêtre ?


Un petit extrait de code (je ne peux vous mettre le code en entier il fait 800 lignes ><, je mettrais donc ce qui me semble essentiel) :
public class Fenetre extends JFrame implements ActionListener
{
public Fenetre (){
                ...
this.setContentPane(buildContentPanel());
        }
private JPanel buildContentPanel()
{
panel = new JPanel();
panel.setLayout(null);
                ...
                // Creation de l'image, stocké dans un JLabel
roueBG = new JLabel (new ImageIcon("roue.png"));
Dimension size = roueBG.getPreferredSize();
roueBG.setBounds(10, 110, size.width, size.height);
panel.add(roueBG);
roueBG.setVisible(true);
            .....
            // Creation de mon RadioBouton, tuneA a ete declare plus haut
    tuneA = new JRadioButton("");
    tuneA.setBounds(80, 200, size.width, size.height);
    panel.add(tuneA);
            tuneA.setVisible(true);
            ...


L'image apparait au dessus et cache mon bouton...

Merci de votre aide !
Afficher la suite 

13 réponses

Répondre au sujet
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 17 janv. 2012 à 07:56
+3
Utile
Bonjour,

Si tu veux ajouter des composants sur ton image, le plus simple est de passer ton image en fond d'un JPanel en surchargeant la méthode paintComponent ;
public class PanelImage extends JPanel {

private BufferedImage image;

public PanelImage(String path){
try {
image = ImageIO.read(new File(path));
}
catch (IOException e) {
e.printStackTrace();
}

}

public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}

}


Et comme ton composant est un JPanel, tu peux facilement poser des choses dessus.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 17 janv. 2012 à 15:54
+1
Utile
Oui, c'est normal. Si tu dessines une image dessus, il n'y a plus de fond normalement.

Avant le drawImage, tu peux insérer ces lignes pour récupérer ton fond :

g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
Commenter la réponse de cs_Julien39
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 17 janv. 2012 à 07:57
0
Utile
Juste une remarque, j'ai écris le code java dans un fichier texte, il y a peut être des erreurs de frappe, mais le principe est là en tout cas.
Commenter la réponse de cs_Julien39
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 14:13
0
Utile
Merci pour ta réponse :)
Si j'ai bien compris, une fois la class implémenté je créer un nouveau JPanel de class JImage :
JImage monPanel = new JImage ("/PATH/IMAGE.png");

Cependant, cela ne revient il pas à déplacer le problème au niveau de la superposition des panels étant donné que j'ai déjà un JPanel contenant tous mes autres éléments ?
Comment définir quel panel est au premier plan ?

Merci d'avance
Commenter la réponse de cs_BXH
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 17 janv. 2012 à 14:33
0
Utile
j'ai déjà un JPanel contenant tous mes autres éléments


Tu remplaces ce panel par le panel image. Au lieu de faire new JPanel, tu fais new PanelImage(path) et tu n'as rien d'autre à modifier.

Et non, ca ne déplace pas le problème. Le panel est un conteneur qui n'a pas d'autre utilité que de contenir des éléments alors que le JLabel lui n'est pas voué à contenir d'autres éléments.
Commenter la réponse de cs_Julien39
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 14:51
0
Utile
Effectivement...Merci beaucoup !
Commenter la réponse de cs_BXH
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 15:07
0
Utile
Hum...autre petit problème maintenant : la méthode setBackground (Color) ne rend plus rien...peut être du faire de la surcharge de paint component ?
Commenter la réponse de cs_BXH
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 17 janv. 2012 à 15:59
0
Utile
Je te donne ce code qui te permet d'ajuster la taille de ton image à ton Panel, ca peut te servir :

public class PanelImage extends JPanel {

   private static final long serialVersionUID = -6350324456764768311L;

   private Image image;

   public void setImage(Image image) {
      this.image = image;
   }

   public Image getImage() {
      return image;
   }

   @Override
   public void paintComponent(Graphics g){
      if(image!=null){
         Graphics2D g2d = (Graphics2D)g;
         g2d.setRenderingHint(
            RenderingHints.KEY_INTERPOLATION, 
            RenderingHints.VALUE_INTERPOLATION_BILINEAR
         );
      g2d.drawImage(image, 0, 0, getWidth(), getHeight(), null);
      }
   }

} 
Commenter la réponse de cs_Julien39
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 17:14
0
Utile
Super ! Merci beaucoup de ton aide
Commenter la réponse de cs_BXH
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 17 janv. 2012 à 18:20
0
Utile
Désolé mais j'ai encore une question...
Mon application dispose de deux modes de fonctionnements qui sont affiché grâce à un radioButton avec un listener qui lance une suite d'action sur mes JComponents (gnagna.setVisible(true) etc etc...)

Comment puis-je faire pour que cette image que j'ai "dessiné" (draw) dans le panel disparaisse/réapparaisse au changement d'état ?
J'ai jeté un coup d'oeil à la librairie Graphics mais je n'ai rien vu qui pourrais m'aider...
Sans compter que du coup l'action de dessiner l'image est effectué dans une autre class...

Merci d'avance
Commenter la réponse de cs_BXH
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 18 janv. 2012 à 07:53
0
Utile
C'est assez facile à faire, je te le fais :

public class PanelImage extends JPanel {

   private static final long serialVersionUID = -6350324456764768311L;

   private Image image;
   private boolean imageVisible;

   public void setImage(Image image) {
      this.image = image;
   }

   public Image getImage() {
      return image;
   }

   public void setImageVisible(boolean visible){
      this.imageVisible=visible;
   }

   @Override
   public void paintComponent(Graphics g){
      g.setColor(getBackground());
      g.fillRect(0, 0, getWidth(), getHeight());
      if(image!=null && imageVisible){
         Graphics2D g2d = (Graphics2D)g;
         g2d.setRenderingHint(
            RenderingHints.KEY_INTERPOLATION, 
            RenderingHints.VALUE_INTERPOLATION_BILINEAR
         );
         g2d.drawImage(image, 0, 0, getWidth(), getHeight(), null);
      }
   }

} 


Et ensuite, quand tu feras un setVisible() sur ton panel, tu pourras faire disparaitre ou apparaitre l'image.
Commenter la réponse de cs_Julien39
cs_BXH 23 Messages postés mercredi 9 août 2006Date d'inscription 12 août 2013 Dernière intervention - 19 janv. 2012 à 14:22
0
Utile
Bonjour,

Bon j'ai essayé plusieurs choses mais le code ne marche pas.
En effet, si j'ai bien compris la méthode draw, cette dernière "dessine" l'image sur le fond : l'image dessiné n'est pas considéré comme un objet sur lequel peut s'appliquer un setVisible et plus encore : une fois dessiner, si on veut l'effacer il faut re-dessiner un rectangle blanc par dessus.
Après quelques échecs infructueux j'ai opté pour une méthode "sale" qui consiste à créer un JLabel vide (JLabel blank = new JLabel (""); ) et de faire un setBounds positionnant le label à la taille de l'image et aux dimensions de mon fond pour ensuite afficher/masquer l'image avec blank.setVisible(false/true);

Voila voila...dans le code c'est pas très beau mais ça marche
Merci de ton aide !
Commenter la réponse de cs_BXH
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 20 janv. 2012 à 07:45
0
Utile
Ok, tant que ca marche et que ca te convient, ca me va aussi.

Et non, l'image ainsi enregistrée n'est pas un objet graphique sur lequel tu peux faire un setVisible(true) ou ce genre de chose, il faut redéfinir toutes les méthodes.

Dans ton cas, ce n'était peut être pas la solution la plus adaptée. Je ne sais pas exactement quelles étaient tes contraintes.

Cette façon de redessiner le fond des JPanel peut servir quand tu as des choses assez complexes à dessiner.

a+
Commenter la réponse de cs_Julien39

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.