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 :

Gérer l'opacité sur composants imbriqués.


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Par défaut Gérer l'opacité sur composants imbriqués.
    Bonjour à tous,

    J'ai toute une série de composants imbriqués, des JLabels, TextFields, des tables des combo, des panels dans des panels... et j'ai besoin de modifier l'opacité de ma hierarchie de composants ( de manière automatique/récursive), pour que mes panels (qui ont un background décoré ) dans lesquels j'aurais ajouté d'autre composants soient visibles par transparence.

    J'aimerais que les composants, ajoutés au fur et à mesure dans mon panel de base, soient mis à setOpaque(false) (quand ce sont certains types de composants), et que ça soit géré à un seul endroit, à savoir dans mon panel de base (qui étend JPanel) et donc à chaque fois qu'un composant est ajouté dans sa hiérarchie d'enfants.

    J'ai tenté 1-2 choses avec des ancestorListeners et containerListener sans grand succès. Quelqu'un peut m'aider à gérer ça de manière appropriée ?

    Grand merci !

  2. #2
    Modérateur
    Avatar de XxArchangexX
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2012
    Messages
    1 159
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 159
    Par défaut
    Bonjour,

    Je n'ai jamais fais l'experience, donc je ne peux te dire si sa fonctionne mais tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // une fois ton interface en place faire
    for(int i = 0; i< JPanel.getComponentCount() ; i++
        	dd.getComponent(i).setOpaque(false);
    L'Etat est bien administré quand l'escalier de l'école est usé et que l'herbe croît sur celui du tribunal.

    Modérateur BI

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Par défaut
    Bonjour,

    La difficulté vient du fait que le setOpaque recursif (et conditionel sur le type de composant) doit être appelé au moment opportunt, à à savoir quand le composant est ajouté au panel.

    Je ne peux pas me permettre de faire du cas par cas dans chaque écran à la fin de la création de l'écran, j'en ai trop, il faut que ça soit un mécanisme standard sur mon panel de base (appelons-le CustomPanel) que je réutilise partout dans mon appli.

    L'idée c'est qu'à chaque ajout d'un composant ou d'un sous panel dans mon CustomPanel, un setOpaque() soit appelé sur ce composant qui vient d'être ajouté. Un composant peut-être ajouté soit à la création du CustomPanel, soit plus tard dynamiquement suite à une action utilisateur. C'est pour ça que j'ai besoin d'un mécanisme de détection d'ajout de composant, qui me permette de descendre dans toute la hiérarchie de mon CustomPanel.
    L'idéal est bien sûr de faire le setOpaque avant l'affichage de mon composant ajouté pour éviter un effet de blink et un problème de repaint.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 61
    Par défaut
    Tu pourrais redéfinir quelques méthodes add() de ton CustomPanel

    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
    @Override
    public Component add(Component c)
    {
    	if (c instanceof JComponent)
    	{
    		((JComponent) c).setOpaque(false);
    	}
    	return super.add(c);			
    }
     
    @Override
    public void add(Component c, Object constraint) // pour les BorderLayout
    {
    	if (c instanceof JComponent)
    	{
    		((JComponent) c).setOpaque(false);
    	}
    	super.add(c, constraint);			
    }
    Le truc, c'est que seuls les fils directs du panel auront le opaque à false. En gros si tu ajoutes à ton CustomPanel un autre panel qui a des boutons, le panel aura le isOpaque() à false, mais pas les boutons.

    Bref, faut arrêter d'utiliser des JPanel classiques et n'utiliser que des CustomPanel avec cette méthode...

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tu peux tous gérer depuis ton CustomPanel.
    Voici un exemple fonctionnel, je n'ai pas fais le code pour mettre tous les fils à setOpaque, mais il gère l'ajout d'un composant dans un JPanel déjà ajouté lui-même dans le CustomPanel. Il faudrait faire de même pour tous les fils JPanel ajoutés dès le départ dans le JPanel de premier niveau :
    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
    49
    50
    51
    52
    53
    54
    55
    import java.awt.Container;
    import java.awt.event.ContainerEvent;
    import java.awt.event.ContainerListener;
     
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
     
    public class SetOpaque extends JPanel implements ContainerListener
    {
    	public SetOpaque()
    	{
    		super();
    		addContainerListener( this );
    	}
     
    	private void setOpaqueFils( JComponent component )
    	{
    		//parcours récursif de tous les fils et de tous leurs descendants pour faire setOpaque( false )
    	}
     
    	@Override
    	public void componentAdded( ContainerEvent event )
    	{
    		System.out.println( "composant " + event.getChild() );
     
    		if( event.getChild() instanceof JComponent )
    		{
    			( (JComponent)event.getChild() ).setOpaque( false );
    		}
     
    		if( event.getChild() instanceof JPanel )
    		{
    			System.out.println( "ok container" );
    			( (JPanel)event.getChild() ).addContainerListener( this );
    			setOpaqueFils( (JPanel)event.getChild() );
    		}
    	}
     
    	@Override
    	public void componentRemoved( ContainerEvent event )
    	{
    	}
     
    	public static void main( String[] arg )
    	{
    		SetOpaque panel = new SetOpaque();
    		panel.add( new JButton( "coucou" ) );
    		JPanel sousPanel = new JPanel();
    		panel.add( sousPanel );
    		sousPanel.add( new JLabel( "hello" ) );
    	}
    }
    Un premier JPanel est ajouté dans le CustomPanel. Puis un JLabel est ajouté dans ce JPanel. cet ajout est correctement détecté parle CustomPanel.
    Il te reste à adapter pour gérer tous les cas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 25
    Par défaut
    Salut dinobogan,

    Ta solution est fort proche de ce que j'ai déjà implémenté, mais j'ai dû louper quelque chose de mon côté. Je teste ta solution ce week-end. et je réplique.

    L'override du add n'est pas suffisamment générique pour résoudre mon problème, mais merci tout de même

Discussions similaires

  1. [Delphi 6] dessiner sur composant QuickRep
    Par KrusK dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/06/2005, 00h48
  2. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46
  3. Réponses: 4
    Dernier message: 08/09/2004, 10h28
  4. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54
  5. Gérer les clics sur les boutons
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 08/02/2004, 15h34

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