Probleme de superposition JLabel sur JFrame-avec-Background

Probleme de superposition JLabel sur JFrame-avec-Background - Java - Programmation

Marsh Posté le 09-11-2009 à 00:51:50    

Bonjour !
Pour mon premier programme Java j'essaie de faire un (tout petit) jeu de combat (si on voit le fond d'ecran et 2 personnages qui bougent je serai deja content :D)
 
Seulement j'ai un probleme pour "superposer" les choses.
 
Pour mon fond j'ai créé une classe BGFrame derivée de JFrame pour prendre en compte "facilement" les fond d'écran. Ca ca marche :)
Mais c'est quand je veux ajouter quelque chose (un joueur : un jlabel) par dessus que ça ne fonctionne plus.
 
BGFrame.java :

Code :
  1. import java.awt.event.*;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class BGFrame extends JFrame
  5. {
  6. Image image;
  7. JScrollPane scrollPane;
  8. public void setBackground(String src)
  9. {
  10.  image = new ImageIcon(src).getImage();
  11.  JPanel panel = new JPanel()
  12.  {
  13.   protected void paintComponent(Graphics g)
  14.   {
  15.    Dimension d = getSize(); //capture les dimensions de la fenetre
  16.    g.drawImage(image, 0, 0, d.width, d.height, null); //dessine l'image aux dimensions de la fenetre
  17.    super.paintComponent(g); //peint la fenetre avec ce qu'on a choisi
  18.   }
  19.  };
  20.  panel.setOpaque(false);
  21.  super.getContentPane().add(panel);
  22. }
  23. }


 
 
 
MainClass.java :

Code :
  1. import java.awt.event.*;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. public class MainClass
  5. {
  6. public static void main(String [] args)
  7. {
  8.  /* CREATION DE LA FENETRE PRINCIPALE */
  9.  BGFrame frame = new BGFrame();
  10.  frame.setTitle("Kung-Fu Mast3r" );
  11.  frame.setSize(1024,768);
  12.  frame.setBackground("sf2-blanka.gif" );
  13.  frame.setResizable(false);
  14.  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15.  frame.setVisible(true);
  16.    
  17.    
  18.     JLabel label = new JLabel("LIUKANG" );
  19.     label.setBackground(Color.red);
  20.     label.setSize(200,200);
  21.     frame.add(label);
  22. }
  23. }


 
 
Plus tard je ferai une class Player (derivé de JLabel a priori) mais je l'ai déjà fait et ça ne marche pas. J'essaie donc de revenir sur des choses simples.
mais ca ne marche toujours pas.
 
 
En fait : je n'arrive pas a superposer un JLabel sur ma BGFrame
Soit on voit mon "background", soit on voit mon "Liu Kang", mais impossible de voir l'un par dessus l'autre.

 
J'ai aussi essayé avec un frame.setContentPane(panel); mais je dois mal l'utiliser.
 
 
Est-ce que quelqu'un pourrait m'aider sur ce probleme de débutant ?
 
 
Merci d'avance :jap:


Message édité par ZePRiNCE le 09-11-2009 à 00:53:19

---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 00:51:50   

Reply

Marsh Posté le 09-11-2009 à 16:30:46    

Personne ne peut m'aider svp ?


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 16:37:29    

ajoute plutot ton label à ton panel... et revois tes bases de GUI java aussi, parce que vu comme tu démarre, tu vas vite ne plus t'y retrouver...

Reply

Marsh Posté le 09-11-2009 à 18:06:51    

pataluc a écrit :

ajoute plutot ton label à ton panel... et revois tes bases de GUI java aussi, parce que vu comme tu démarre, tu vas vite ne plus t'y retrouver...


Mon panel liukang ?
 
L'ajouter où ?
 
J'aimerais separer le fond d'ecran et les différents panel que je vais ajouter "par dessus" (joueur 1, joueur 2, vie 1, vie 2)
 
J'ai jamais eu aucun cour donc oui, il me manque des bases c'est certain.
Tu pourrais me dire comment faire ça facilement et proprement stp (donc en séparant bien les choses :/)
 
 
(tu me parlais de tout mettre en vrac dans mon paintcomponent de Label>BGFrame ? :| )


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 18:24:15    

C'est ma BGFrame qui n'est pas bien ?


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 21:34:44    

Il dit que tu dois mettre ton JLabel dans le JPanel et pas dans la JFrame, puisque c'est le JPanel qui contient l'image d'arrière-plan et pas la fenêtre elle-même.
 
Donc tu gardes une référence vers ton panel et tu ajoutes ton label dedans.
 
Et de toutes manières tu ne peux pas appeler add() sur une JFrame pour mettre un composant Swing dedans, add() c'est une méthode réservée à AWT sur les Frames. En Swing il faut faire getContentPane().add() comme tu le fais déjà pour ajouter le panel à ta fenêtre d'ailleurs.

Message cité 1 fois
Message édité par cbeyls le 09-11-2009 à 21:36:00
Reply

Marsh Posté le 09-11-2009 à 21:44:09    

Et je pense que la meilleure façon de charger une image depuis une URL c'est:
 

Code :
  1. Image image = Toolkit.getDefaultToolkit().getImage(url);


Message édité par cbeyls le 09-11-2009 à 21:48:52
Reply

Marsh Posté le 09-11-2009 à 22:23:51    

cbeyls a écrit :

Il dit que tu dois mettre ton JLabel dans le JPanel et pas dans la JFrame, puisque c'est le JPanel qui contient l'image d'arrière-plan et pas la fenêtre elle-même.


A ce propos, est-ce possible de mettre une image en arriere plan dans la JFrame directement, plutot que de prendre un JPanel de 100% et de lui mettre une image. ?
 
Pour ton 2e post, les images sont en locales.
 
 
Je viens d'essayer de mettre le LiuKang directemetn dans le fichier BGFrame.java, dans son JLabel ou bien dans un nouveau main de BGFrame.java mais c'est toujours pareil, on voit soit l'un, soit lautre.
 
Je vais regarder du coté de JLayeredPane c'est ce que j'ai trouvé avec Google.....  :??:


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 23:33:07    

cbeyls a écrit :

Quand je dis de mettre le label dans le panel je ne parle pas d'organisation du code, je veux dire que tu dois faire panel.add(label) et pas frame.add(label) !


Ah oui effectivement, ca fonctionne, merci.
 
Sauf qu'il ne connait pas "label" depuis MainClass, donc je dois créer mon JLabel LiuKang depuis BGFrame et c'est pas tres "logique"
Je vais regarder comment découper ça bien.
 
:)


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Marsh Posté le 09-11-2009 à 23:34:14    

Quand on dit de mettre le label dans le panel on ne parle pas d'organisation du code: tu dois faire panel.add(label) et pas frame.add(label) !
 
Si tu ne veux pas passer par le JPanel tu peux essayer d'overrider la méthode paint() de ta JFrame au lieu d'overrider paintComponent sur le Panel, et bien sûr ne pas oublier d'appeler super.paint() à la fin sinon les labels ne seront pas dessinés sur l'arrière-plan.
 
Pour le chargement de l'image en local ma remarque reste la même. Remplace l'url de mon exemple par une chaîne de caractères qui représente le path.
 
JLayeredPane semble en effet adapté si tu veux plusieurs éléments qui se superposent sur plusieurs niveaux.


Message édité par cbeyls le 09-11-2009 à 23:35:15
Reply

Marsh Posté le 09-11-2009 à 23:34:14   

Reply

Marsh Posté le 10-11-2009 à 02:27:37    

J'ai réussi a m'en sortir grace a ce que tu m'as dit :D
 
Pas besoin de JLayeredPane  puisque au maximum ya le background et le joueur par dessus :)
 
Merci beaucoup ! :hello:


---------------
A VENDRE: Razer Chroma ARGB Controller / Boitier / Support Triple Screen / Ventirad / Carte USB3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed