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 :

[z-order] superposition de composants


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut [z-order] superposition de composants
    Bonjour,

    J'essaye de superposer deux panneaux en utilisant des GridBagConstraints, et cela semble fonctionner sur la plupart des composants, mais pas sur tous.
    Grâce à la propriété setComponentZOrder(int order) on peut définir qui est le panneau qui sera affiché par dessus l'autre. Mais si je crée un panneau contenant des objets complexes, tels qu'un JSpinner par exemple, celui-ci ne semble pas positionné sous, mais sur le panneau qui est sensé être au dessus.

    Voici le code qui vous permettra de mieux vous rendre compte :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    	public static void main(String... args)
    	{
    		// Nouvelle fenetre (1)
    		javax.swing.JFrame frame = new javax.swing.JFrame();
    		// Panneau principal (2)
    		javax.swing.JPanel contentPane = new javax.swing.JPanel();
    		// Panneau contenant tabbed + spinner (3)
    		javax.swing.JPanel composantPane = new javax.swing.JPanel();
    		composantPane.setLayout(new java.awt.BorderLayout());
     
    		// TabbedPane (4)
    		javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane();
    		tabbedPane.addTab("Tab 1", new javax.swing.JPanel());
    		tabbedPane.addTab("Tab 2", new javax.swing.JPanel());
    		tabbedPane.addTab("Tab 3", new javax.swing.JPanel());
     
    		// Spinner (5)
    		javax.swing.JSpinner spinner = new javax.swing.JSpinner();
     
    		// Ajout des composants dans (3)
    		composantPane.add(spinner, java.awt.BorderLayout.NORTH);
    		composantPane.add(tabbedPane, java.awt.BorderLayout.CENTER);
     
    		// Création d'un panneau superposé au (2)
    		javax.swing.JPanel glassPane = new javax.swing.JPanel();
    		glassPane.setOpaque(true);
    		glassPane.setBackground(java.awt.Color.RED);
    		glassPane.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.GREEN));
     
    		// Ajout des composants au (2)
    		contentPane.setLayout(new java.awt.GridBagLayout());
    		contentPane.setPreferredSize(new java.awt.Dimension(300,300));
    		java.awt.GridBagConstraints c = new java.awt.GridBagConstraints();
    		c.gridx=0; c.gridy=0; c.weighty=1; c.weightx=1;
    		c.fill = java.awt.GridBagConstraints.BOTH;
    		contentPane.add(composantPane, c);
    		contentPane.add(glassPane, c);
     
    		// Ordre des composants affichés pour (2)
    		contentPane.setComponentZOrder(glassPane, 0);
    		contentPane.setComponentZOrder(composantPane, 1);
     
    		// Gestion de la fenêtre (1)
    		frame.setContentPane(contentPane);
    		frame.pack();
    		frame.setVisible(true);
    	}
    Théroriquement, j'aimerais que le JSpinner ne soit plus visible. Il devrait être sous le panneau rouge. Or, la zone de texte reste visible, et les boutons s'affichent quand on passe la souris dessus.

    Avez vous des idées pour solutionner ce problème d'affichage ? En vous remerciant.

  2. #2
    Membre chevronné Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Par défaut
    on peut définir qui est le panneau qui sera affiché par dessus l'autre
    Je crois que le z-order définit l'ordre dans lequel les composants vont être déssinés lorsque le container se déssine; par contre, un composant peut se redéssiner indépendamment et dans ce cas, le Z-order...

  3. #3
    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
    Utilises un JLayeredPane dans ce cas

  4. #4
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut
    Mhh ok.

    Je vais étudier vos réponses demain et je vous tiens au courant.
    Pour la réponse de xixi, je vais tester un truc en surchargeant la méthode paint, mais pas sur que ça fonctionne puisque ce ne sera pas la méthode du panneau contenant mais celle du panneau contenu qui posera problème (sachant que le panneau contenu (le spinner par exemple) ne sera pas défini).

    Pour la réponse de sinok, je vais me documenter sur le sujet, j'avoue que je ne connais pas trop ce composant.

    Merci infiniment pour vos pistes en tous cas, je vous tiens au jus.

  5. #5
    Membre très actif
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Par défaut
    Bonjour !

    Donc comme prévu, la surcharge de repaint ne mène à rien.
    Par contre j'essaye d'utiliser un JLayeredPane, ça marche très bien après quelques essais, mais j'avoue que je ne comprends pas exactement ce que je fais.

    - On ne peut pas positionner les composant à l'aide de GridBagConstraints ?
    - L'exemple fourni par sun ( http://java.sun.com/docs/books/tutor...dPaneDemo.java ) montre comment positionner les panneaux et le petit "Duke". Deux méthodes add sont employées :
    add(composant, constraints, index) pour le Duke
    et
    add(composant, constraints) pour les panneaux.

    Dans mon cas j'ai du faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    contentPane.add(glassPane, 2, 0);
    contentPane.add(composantPane, 0, 0);
    Le contentPane est le fameux JLayeredPane à présent. Je n'ai pas pu lui définir de layout, et d'après la doc, ça ne semble pas prévu pour.

    Ici, les contraintes sont représentées par le 2 et le 0 en deuxième argument. L'index reste à 0, mais si je ne le spécifie pas, l'affichage n'est pas correct.

    Pouvez-vous m'éclairer encore un petit peu ?
    Merci encore

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Les layouts classiques ne sont pas prévus pour superposer des composants. Si ça marche, c'est un hasard.

    Il faut donc que tu gères - ou invente - toi même un layout correspondant à la superposition que tu souhaites, ou alors, si le cas est simple, faire avec un layout null et positionner tout le monde directement.

    Et ce, que ce soit avec un JLayeredPane ou avec le ZOrder.

    Donc, première bonne action de la Nouvelle Année : fiche à la poubelle le GridBagLayout.

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

Discussions similaires

  1. [RowLayout] Superposition des composants
    Par Julien Bodin dans le forum SWT/JFace
    Réponses: 7
    Dernier message: 26/03/2009, 17h39
  2. Superposition de composants
    Par vpourchet dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 11/06/2008, 12h08
  3. Superposition de composant pour faire une image
    Par spikto dans le forum Composants VCL
    Réponses: 14
    Dernier message: 31/12/2005, 15h18
  4. [info] Superposition de composant
    Par doudine dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 22/12/2005, 10h55
  5. [BorderLayout] superposition des composants.
    Par vasilov dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 08/07/2005, 11h51

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