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

Agents de placement/Fenêtres Java Discussion :

JPanel transparent et JProgressBar


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut JPanel transparent et JProgressBar
    Bonjour,

    Pendant un chargement, je souhaite afficher une zone (JPanel) avec un "voile" pour griser légèrement le contenu en dessous. Le JPanel a donc un background null et un setOpaque(false).
    Pour le "voile" j'ai implémenté la méthode paintComponent() de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public void paintComponent(Graphics g) {
            super.paintComponent(g);       
            Graphics2D g2 = (Graphics2D)g ;
            g2.setColor(Color.black);
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
            g2.fillRect(0,0,this.getBounds().width,this.getBounds().height);
            g2.dispose();
        }
    Sur ce JPanel, je veux afficher un JProgressBar.
    Seulement , si j'obtiens le voile avec la méthode paintComponent(), la progressBar n'apparait jamais. Si je retire la méthode paintComponent() la progressBar apparait correctement.
    Que dois-je faire pour avoir les deux ?
    D'avance merci.

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Comme ceci, ça fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public void paintComponent(Graphics g) {
            super.paintComponent(g);       
            //Graphics2D g2 = (Graphics2D)g ;
            g.setColor(new Color(0,0,0,20));
            //g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, fTrsp));
            g.fillRect(0,0,this.getBounds().width,this.getBounds().height);
            //g2.dispose();
        }
    Curieux, la présence de Graphics2D semble créer le problème.

  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
    Il ne faut jamais appeler la méthode dispose sur les Graphics fournis en paramètre de paintComponent, car ceux ci servent par la suite à dessiner d'autre composant.

    Dans ton cas, il aurait fallu créer un contexte graphique temporaire en procédant de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public void paintComponent(Graphics g) { 
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create(); // Création d'un contexte
                                                        // graphique temporaire
            g2.setColor(Color.black);
            g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                    fTrsp));
            g2.fillRect(0, 0, this.getWidth(), this.getHeight());
            g2.dispose();
        }

  4. #4
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ok, merci pour le tuyau
    Finalement, laquelle des 2 méthodes est la plus appropriée, celle avec Graphics ou celle avec Graphics2D ?

  5. #5
    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
    J'aurais tendance à dire Graphics2D, juste car elle est plus récente.

    Mais dans le cas présent, ça un petit côté overkill.

    L'histoire des contextes graphiques temporaires marche de toute façon que ce soit avec des Graphics et Graphics2D, et à le gros avantage de faire en sorte que toutes les transfos appliquées sur les Graphics disparaissent au moment du dispose...

    Donc garde celle que je t'ai donné.

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Merci encore

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

Discussions similaires

  1. JPanel transparent (tous sans exceptions)
    Par aristeas dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/02/2009, 00h16
  2. Réponses: 6
    Dernier message: 08/11/2007, 01h43
  3. Un JPanel transparant
    Par bilal_inf dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/04/2007, 19h34
  4. [Débutant] JPanel transparent
    Par moris113 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 01/06/2006, 02h48
  5. Réponses: 5
    Dernier message: 19/03/2006, 09h39

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