IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Pas d'affichage avec un JLayeredPane


Sujet :

AWT/Swing Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut Pas d'affichage avec un JLayeredPane
    Bonjour à tous,

    J'ai essayé d'afficher une simple image en utilisant un JLayeredPane mais je n'ai rien qui s'affiche( j'ai une JFrame vide). ça marche bien en récupérant le container par defaut de la JFrame (getContentPane) mais pas avec le LayeredPane. Aurais-je oublié quelque chose ?

    Voici mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public static void main(String[] args) {
    		JFrame frame = new JFrame ("Test de superposition");
    		JLayeredPane lp = frame.getLayeredPane();
    		JPanel p1 = new JPanel();
    		ImageIcon ic = new ImageIcon ("D:/Mes documents/ENIC/PST/clips CPR/vidcap2/vlcsnap-828756.jpg");
    		JLabel l = new JLabel (ic);
     
    		p1.add(l);
    		lp.add(p1,1);
     
    		frame.setSize(700,500);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    	}

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Un layered pane n'a pas de layout, il faut faire un setBounds() sur le composant que tu ajoutes dedans (et au passage, assure-toi que tu mets ce composant sur le bon layer...).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut
    OK, ça marche merci ! (mais il fallait le savoir )

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut
    ... J'ai parlé trop vite...

    Avec 1 composant ça marche mais pas avec 2 !
    En effet, j'arrive bien à afficher l'image mais lorsque que je veux superposer dessus un simple rectangle (redéfinition de la méthode paint du JComponent), ce dernier ne s'affiche pas malgré le fait que j'ai refais un setBounds() sur ce component et que lors de l'ajout au layeredPane je lui ai donné un numéro supérieur à celui de l'image.

    Ce qui est bizarre, c'est quand je fais un test avec 2 rectangle, ça marche.
    En fait, quand je fais un setVisible (false) sur mon image, le rectangle apparait. Cela laisse penser que ben qu'ayant un numéro plus faible, l'image s'affiche quand même en premier plan. A quoi cela est-il du ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    	public void paint(Graphics g) {
    		// TODO Auto-generated method stub
    		g.setColor(Color.red);
    		g.drawRect(50, 50, 100, 50);
     
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame ("Test de superposition");
    		JLayeredPane lp = frame.getLayeredPane();
    		JPanel p1 = new JPanel();
    		ImageIcon ic = new ImageIcon ("D:/Mes documents/ENIC/PST/clips CPR/vidcap2/vlcsnap-828756.jpg");
    		JLabel l = new JLabel (ic);
    		p1.setBounds(0, 0, 640, 480);
    		Test2 comp = new Test2 (); //Test2 hérite de JComponent
    		comp.setBounds(0, 0, 640, 480);
     
    		p1.add(l);
    		lp.add(p1,1);
    		lp.add(comp,2);
     
    		p1.setVisible(true); //Quand on met à false, le rectangle apparait !
    		frame.setSize(700,550);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
    	}
    Note : Si j'ajoute dans le LayeredPane le rectangle en premier alors celui-ci s'affiche bien au dessus de l'image. J'ai l'impression que les numéros pour définir la place des composants ne fonctionnent pas (à moins que je ne sache pas m'en servir )

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    quanq tu redéfinies paint tu doit faire au debut super.paint(). De plus il vaut mieux redefinir paintComponent mais je ne sais plus exactement pourquoi (le paint appel lui même le paintComponent idem pour le repaint mais mes souvenirs sont vague la dessus donc à ne pas prendre au pieds de la lettre et à verifier).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut
    Mais en fait c'est pas que mon rectangle ne s'affiche pas, c'est plutôt qu'il n'est pas sur la bonne couche de mon LayeredPane.
    Si je l'ajoute en 2 ème alors quelque soit le numéro que je vais indiquer, il sera toujours derière l'image. Tandis que si je l'ajoute en premier alors il sera toujours au premier plan quelque soit encore le "numéro de couche" indiqué.

    Dans mon cas c'est pas forcement gênant car je ne compte pas changer mes composants de couche mais bon pour le principe j'aimerais savoir pourquoi ça ne marche pas.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    quand tu fait lp.add(cmp1,1) tu ajoute sur la couche 1
    quand tu fait lp.add(cmp2,2) tu ajoute sur la couche 2
    donc normalement cmp2 est devant cmp1 car 2>1
    Par default on ajoute à la couche 0 si le second argument est négtif alors c'est derrière si c'est positif alors c'est devant.
    Est-ce que ça repond à ta question ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par atha2 Voir le message
    quand tu fait lp.add(cmp1,1) tu ajoute sur la couche 1
    quand tu fait lp.add(cmp2,2) tu ajoute sur la couche 2
    donc normalement cmp2 est devant cmp1 car 2>1
    Oui, mais apparemment ça marche pas

    J'ai fait des tests voici les résultats (p1 : JPanel contenant l'image et comp et le rectangle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp.add(p1,0);
    lp.add(comp,0);
    Là ça marche (même couche), on voit le rectangle mais est-il au dessus ou bien l'image est modifiée pour faire apparaitre le rectangle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp.add(p1,0);
    lp.add(comp,1);
    Ici ça ne marche pas


    A vrai dire je ne comprend pas pourquoi ça ne marche pas.

    Citation Envoyé par atha2 Voir le message
    Par default on ajoute à la couche 0 si le second argument est négatif alors c'est derrière si c'est positif alors c'est devant.
    En faisant ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp.add(p1,-1);
    lp.add(comp,1);
    ça ne marche pas non plus.


    Par contre là le placement marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp.add(p1,0,0);
    lp.add(comp,1,0);
    Le rectangle sera bien au dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    lp.add(p1,1,0);
    lp.add(comp,0,0);
    Et là c'est bien l'image qui est au dessus.

    Alors pourquoi ça marche avec la méthode add à 3 arguments mais pas avec 2 arguments ?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    en fait tu a deux methode qui rentre en concurence:
    Component add(Component comp, int index)
    Adds the specified component to this container at the given position.
    void add(Component comp, Object constraints)
    Adds the specified component to the end of this container.
    Normalement pour faire ce que tu veut tu fais appel à la deuxieme donc il ne faut pas faire add(cmp,1) mais add(cmp,new Integer(1)).
    Rq: normalement on utilise les constantes de la classe LayeredPane qui sont bien des Integer(J'ai verifié dans la javadoc)

    pourquoi alors add(cmp,1,0) marche ?
    void add(Component comp, Object constraints, int index)
    Adds the specified component to this container with the specified constraints at the specified index.
    Donc en faite il reconnait bien que le premier entier est la contraint et le convertit directement en Integer(autoboxing tu dois avoir java5 ou plus)
    Donc voila pour ta reponse.Il reste cependant un problème:
    sachant que java5 gere l'autoboxing comment le compilateur fait t'il la difference entre les 2 premiere methodes. Est-ce qu'il ne fait la conversion Integer<->int que lorsqu'il en est forcé ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 160
    Points : 111
    Points
    111
    Par défaut
    EN effet, en faisant des new Integer, la superposition marche parfaitement.
    Au temps pour moi, je n'avais pas vu qu'il fallait des Objets Integer et pas un simple int.

    Quant à l'autoboxing, le compilateur le fait automatiquement lors de l'appel à la méthode à 3 arguments car elle est seule, il n'y a pas de confusion possible.
    Alors que pour les "add()" à 2 arguments, le compilateur ne peut pas deviner laquelle des 2 méthodes utiliser. Il prend donc la méthode qui correspond au plus près aux arguments rentrés (cas où il n'y a pas besoin de conversion). Pas étonnant alors qu'en rentrant un "1", c'est la mauvaise méthode qui était appelée.

    En tout cas merci à toi pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pas d'affichage avec opengl glut
    Par mar1985 dans le forum OpenGL
    Réponses: 1
    Dernier message: 25/03/2014, 08h45
  2. Pas d'affichage avec l'appel des pages par include
    Par jlb59 dans le forum Langage
    Réponses: 4
    Dernier message: 22/05/2011, 13h33
  3. pas d'affichage avec openGL
    Par momo l'plus bô dans le forum OpenGL
    Réponses: 2
    Dernier message: 07/05/2011, 10h12
  4. Réponses: 3
    Dernier message: 12/06/2010, 10h16
  5. Pas d'affichage avec les VBO
    Par GLDavid dans le forum OpenGL
    Réponses: 2
    Dernier message: 15/06/2009, 16h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo