Superposition image et boutons + texte

Résolu
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 - 17 janv. 2012 à 02:34
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 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 !
A voir également:

13 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 janv. 2012 à 07:56
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.
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 janv. 2012 à 15:54
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());
1
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 janv. 2012 à 07:57
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.
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
17 janv. 2012 à 14:13
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 janv. 2012 à 14:33
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.
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
17 janv. 2012 à 14:51
Effectivement...Merci beaucoup !
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
17 janv. 2012 à 15:07
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 ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
17 janv. 2012 à 15:59
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);
      }
   }

} 
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
17 janv. 2012 à 17:14
Super ! Merci beaucoup de ton aide
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
17 janv. 2012 à 18:20
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
18 janv. 2012 à 07:53
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.
0
cs_BXH Messages postés 23 Date d'inscription mercredi 9 août 2006 Statut Membre Dernière intervention 12 août 2013 2
19 janv. 2012 à 14:22
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 !
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
20 janv. 2012 à 07:45
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+
0
Rejoignez-nous