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 :

[SWING] pb d'affichage JTextArea translucide


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut [SWING] pb d'affichage JTextArea translucide
    J'ai une JFrame avec une image de fond dans laquelle je met un JTextArea.
    Comme je veux pas avoir le fond blanc qui me cache ma jolie image, je la fais devenir translucide (en faisant un setBackground( 'une Color translucide' ))

    Jusque-là, ça marche nickel, je vois mon image et ma JTextArea est repérable grâce à la teinte un peu plus foncée.
    Le problème, c'est que dès que je tape du texte dedans, c'est la catastrophe, y'a des bugs d'affichages, l'image de fond est en partie déplacée, c'est affreux!!!!
    que dois-je faire?

    Pour info, j'ai essayé une méthode bourrin du genre un repaint() de la JFrame (dans un CarretListener), ça marche mais c'est trop lent, on voit la surpercherie. Le repaint() de la textArea ne fait rien lui...

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Fait un setOpaque(false) sur ta JTextArea avant de mettre une couleur transparente en fond.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    ça ne fonctionne toujours pas.
    Si je fais un setOpaque(false) sur la JTextArea, y'a plus de bug d'affichage, certes, mais elle devient totalement transparente.
    C'est pas tout à fait ce que je recherche. Je veux mettre une sorte de voile par dessus.

    Pour l'instant, la seule solution que j'ai trouvée consiste à la mettre totalement transparente et de superposer le rectangle de couleur avec un alpha non nul dans le GlassPane.

    Si quelqu'un à plus simple, je suis preneur.

    J'ai d'ailleurs vu un phénomène étrange :
    J'ai également eu ces bugs avec des JTextField, mais pas tout le temps.
    Je cherche d'où ça peut venir, mais je n'ai pas encore trouvé la différence d'utilisation entre le moment où ça marche et où ça plante...

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Je viens de trouver le problème !
    J'ignore la véritable raison de ce problème d'affichage de zones transparentes, mais je sais comment y remédier :
    il suffit de rajouter la commande "mafenetre.getGlassPane().setVisible(true)".
    ça a l'air con, mais faut le trouver.

    Pour illustrer le problème, essayez le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JTextField tField = new JTextField(10);
            tField.setBackground(new Color(50,50,50,50));
            fenetre.getContentPane().add(tField);
            fenetre.pack();
            fenetre.setVisible(true);
            fenetre.getGlassPane().setVisible(true);
    regarder ce que ça donne en commantant la dernière ligne : la fenetre devient de plus en plus foncée à mesure qu'on fait qqchose avec la fenetre.
    Les calques doivent se superposer, ce qui assombri le tout.
    Par contre, j'ignore pourquoi le fait de rendre le GlassPane visible change les choses...

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Ce n'est pas la bonne solution. Il faut bel et bien appeler setOpaque(false) sur la zone de texte. Malheureusement certains composants Swing interprète la propriété isOpaque() de manière plus large que les spécifications. Il faut donc simplement surcharger JTextArea (ou JTextField) et sa méthode paintComponent() pour dessiner le fond translucent.

    Tu as toujours le même problème avec ton glass pane. Si tu ne dis pas setOpaque(false) tu auras toujours des bugs d'affichage (qui sont d'ailleurs à l'origine de ton assombrissement).

    Swing considère par défaut que les composant sont opaques, c'est-à-dire qu'ils dessinent chaque pixel de leur zone d'affichage avec une couleur totalement opaque. En procédant ainsi, Swing sait qu'il n'a pas à redessiner les composants qui se trouvent en dessous. En appelant setOpaque(false) tu dis à Swing que ton composant ne dessinera pas tous les pixels de manière opaque et qu'il faut donc redessiner ce qui se trouve en dessous. Malheureusement, certains composants Swing vont plus loin et décident de ne pas dessiner leur arrière-plan lorsque cette propriété est vraie. C'est une erreur mais bon, c'est ainsi. Bref, si tu ne dessines pas complètement ton composant (i.e. avec une couleur transparente) Swing ne redessine rien de ce qui se trouve en dessous ou ne réinitialise pas la zone de dessin. Tu superposes donc ta couche transparente à chaque repaint. Et que se passe-t'il lorsque tu redessine avec la même couleur translucente au même endroit ? Tu "assombris" l'écran (en fait tu tends vers la couleur opaque correspondant à ta couleur translucente).

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

Discussions similaires

  1. Problème d'affichage JTextArea
    Par nickkian dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 03/07/2006, 17h28
  2. Affichage JTextArea dans un JScrollPane
    Par krum dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/05/2006, 11h03
  3. [Swing] Problème d'affichage dans un JScrollPane
    Par Adrien22 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 14h36
  4. [Swing]Problème d'affichage sur un JTree
    Par tomca dans le forum Composants
    Réponses: 4
    Dernier message: 19/01/2006, 10h41
  5. [Swing] problème d'affichage
    Par l'obstiné dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/08/2004, 18h05

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