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 :

Problème de superposition avec JLayeredPane


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut Problème de superposition avec JLayeredPane
    Bonjour! Enfin Bonsoir ^^

    Je viens demander votre aide parce que j'ai un petit (gros?) soucis avec mon JLayeredPane. Je fais d'abord un bref topo. J'ai une fenêtre d'édition d'image qui comprend un ScrollPane. Dans ce dernier, j'ai créé un JLayeredPane.
    Ce dernier doit contenir un JLabel contenant l'image en cours d'édition ainsi que, par dessus, un JPanel contenant un rectangle.
    Mais malheureusement, je ne parviens pas à superposer ces deux panels... Ils se mettent côte à côte.
    Voici la portion de code qui me pose soucis:
    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
     
    		JScrollPane scrollPane = new JScrollPane();
    		final JLayeredPane centralPanel = new JLayeredPane();
    		scrollPane.setViewportView(centralPanel);
    		editor.getContentPane().add(scrollPane);
    		centralPanel.setLayout(new GridLayout(1,1));
     
    		//Afficher l'image que l'on souhaite éditer
    		imageLabel = new JLabel();
    		imageLabel.setIcon(new ImageIcon(getParentFrame().stock.getImageOriginale(path)));
    		imageLabel.setHorizontalAlignment(JLabel.CENTER);
    		imageLabel.setVerticalAlignment(JLabel.CENTER);
    		centralPanel.add(imageLabel);
    		centralPanel.setLayer(imageLabel, 0);
     
    		//préparer d'ores et déjà le panel qui contient le rectangle de sélection,
    		//mais ne pas l'afficher
    		selectionPanel = new SelectionPanel();
    		selectionPanel.setVisible(false);
    		centralPanel.add(selectionPanel);
    		centralPanel.setLayer(selectionPanel, 1);
    J'ai tenté de définir la profondeur via la méthode add, ou via la méthode SetLayer, mais ça revient au même. J'ai tenté de changer le layout de centralPanel, mais ça ne fait rien de bon non plus (j'ai testé Flow, Border, et Box Layout. BoxLayout déclenche une exception disant qu'un BoxLayout ne peut être partagé).

    Merci d'avance!

  2. #2
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Personne pour m'aider? J'ai également tenté de mettre les deux panels à la même profondeur et de changer la position, mais ça ne change rien non plus, les deux panels restent côte à côte.

  3. #3
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    Salut !

    Changer de layout ? écrire ton propre layout ?
    http://www.developpez.net/forums/d52...cement-layout/

  4. #4
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Déjà, merci pour cette réponse! Mais comme écrit dans mon premier message, j'ai déjà tenté de changer le layout, mais ça empire presque les choses...

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Bon je m'excuse de faire des posts multiples, mais je désespère...

    Le SelectionPanel se met à gauche et le imageLabel à droite, SAUF si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    centralPanel.add(imageLabel, 0);
    centralPanel.add(selectionPanel, 1);
    Là, ça s'inverse. Mais ça se superpose toujours pas...

    EDIT : En fait, je me demande si c'est pas le fait que ça soit un GridLayout qui fait ça. Je m'explique. Quand je met un GridLayout, ça fait deux panels de taille égale côte à côte. Quand je fais FlowLayout, ils sont toujours côte à côte, mais le SelectionPanel est tout petit, vu que le GridLayout met tous les composants à la taille de la case qui les contient.
    Est-ce qu'il n'y a pas un Layout permettant de tout mettre "au même endroit"? Ou d'imposer au GridLayout d'insérer les éléments dans la même case? C'est ce que je pensais avoir fait en définissant le GridLayout avec une ligne et une colonne. Mais de toute évidence, ce n'est pas le cas...

    EDIT² : Je viens de voir sur oracle que l'on doit définir le Layer avant d'ajouter le composant enfant au layeredPane parent. Donc j'ai inversé mes lignes de code. Mais... ça ne change rien! Je crois que je vais devenir dingue >.<
    Voici donc la tronche qu'a mon code maintenant :
    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
    		JScrollPane scrollPane = new JScrollPane();
    		final JLayeredPane centralPanel = new JLayeredPane();
    		scrollPane.setViewportView(centralPanel);
    		editor.getContentPane().add(scrollPane);
    		centralPanel.setLayout(new GridLayout(1,1));
     
    		//Afficher l'image que l'on souhaite éditer
    		imageLabel = new JLabel();
    		imageLabel.setIcon(new ImageIcon(getParentFrame().stock.getImageOriginale(path)));
    		imageLabel.setHorizontalAlignment(JLabel.CENTER);
    		imageLabel.setVerticalAlignment(JLabel.CENTER);
    		centralPanel.setLayer(imageLabel, 0);
    		centralPanel.add(imageLabel);
     
    		//préparer d'ores et déjà le panel qui contient le rectangle de sélection,
    		//mais ne pas l'afficher
    		selectionPanel = new SelectionPanel();
    		selectionPanel.setVisible(false);
    		centralPanel.setLayer(selectionPanel, 0);
    		centralPanel.add(selectionPanel);
    Autre remarque : en inversant l'ordre d'insertion de mes composants, leur position relative change. C'est-à-dire que le premier que j'insère sera celui qui sera à gauche.
    Je précise que oui mon panel est mis invisible, mais j'ai un bouton permettant de l'afficher.

  6. #6
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    On ne se connait pas, mais j'ai envie de te sauter dans les bras là mdr. J'ai à nouveau un peu d'espoir ^^
    Ca donne pas exactement ce que je souhaitais, mais il y a un grand mieux : les deux panels sont bien superposés!
    MAIS :
    • L'image en elle-même n'est pas du tout centrée.
    • Le SelectionPanel n'est pas transparent (je vais fouiller un peu dans la doc, je devrais bien trouver... enfin j'espère!).
    • Quand je trace mon rectangle (c'est à ça que sert mon SelectionPanel), l'image disparaît des fois.


    Est-ce que tu aurais quelques "conseils d'usage" pour moi?
    Mille fois merci!

    EDIT : Ho mais quelle abrutie je vous jure... Forcément si je met le même layer pour les deux, ça bug u_u Troisième point réglé!
    Pour la transparence, j'ai mis setOpaque à false mais ça ne change rien, mon panel est toujours blanc

    EDIT² : Problème d'alignement réglé avec un setAlignmentX et Y (JPanel.CENTER_ALIGNMENT) sur le JLabel

    EDIT³ : J'ai tenté un setBackground sur mon SelectionPanel, mais il reste blanc...

  8. #8
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Citation Envoyé par DieNah Voir le message
    Le SelectionPanel n'est pas transparent (je vais fouiller un peu dans la doc, je devrais bien trouver... enfin j'espère!).
    ...
    Pour la transparence, j'ai mis setOpaque à false mais ça ne change rien, mon panel est toujours blanc
    ...
    EDIT³ : J'ai tenté un setBackground sur mon SelectionPanel, mais il reste blanc...
    On peut voir la redéfinition de "paintXxx" dans SelectionPanel qui dessine le rectangle ?

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    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
    public void paintComponent(Graphics g) {
    		g.clearRect(0, 0, getWidth(), getHeight());
    		if(origin != null) {
     
    			int tmp;
     
    			int x1 = (int)(origin.getX());
    			int y1 = (int)(origin.getY());
    			int x2 = (int)(end.getX());
    			int y2 = (int)(end.getY());
     
    			if(x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
    			if(y1 > y2) { tmp = y1; y1 = y2; y2 = tmp; }
     
    			g.drawRect(x1, y1, x2-x1, y2-y1);
    			super.paintComponent(g);
    		}
     
    	}
    Voilà

  10. #10
    Membre expérimenté
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void paintComponent(Graphics g) {
    	g.clearRect(0, 0, getWidth(), getHeight()); // À enlever. 
    	if(origin != null) {
    
    		...
    
    		g.drawRect(x1, y1, x2-x1, y2-y1);
    		super.paintComponent(g); // Pas utile.
    	}
    }
    La méthode 'clearRect' remplit un rectangle de la couleur 'background', écrasant le dessin du composant en dessous.

  11. #11
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Ho ok :-) Je suis débutante avec swing et les graphics. Je vais tester ça dès que j'ai accès à un ordi. Merci !

  12. #12
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Dans ton cas, la solution la plus propre aurait plutôt de passer par un JLayer, classe intégrée à java depuis la version 7. Tu aurais éviter tous les problèmes relatifs au JLayeredPane...

    Ou un JXLayer (son ancêtre) si tu bosses en java<7.

  13. #13
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Je viens de tester avec les modifications, et c'est parfait! J'ai pas encore essayé avec JLayer, mais je le ferai quand j'aurais un peu d'avance dans mon travail et que j'essaierai d'optimiser un peu
    Encore mille fois merci!
    Dernière question même si mon problème en tant que tel est résolu : comment est-ce que je fais pour effacer le rectangle dessiné? Je peux bien sûr me contenter de mettre la visibilité du SelectionPanel à false, mais j'aimerais que lorsque je demande à réafficher le panel, le rectangle ait disparu. Comment faire?

Discussions similaires

  1. [C#] Problème de superpositions d'éléments avec MDI
    Par Gold.strike dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/07/2006, 15h18
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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