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 :

Ajouter la transparence à un composant


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Par défaut Ajouter la transparence à un composant
    Salut,

    Désolé pour toutes les questions que je pose mais je débute plus ou moins en Java... :)

    J'essaye de rendre un JToolTip transparent en utilisant un UI delegate pour surcharger la méthode paint. Seulement, d'après ce que j'ai pu trouver comme informations sur le sujet, un AlphaComposite permet de définir la transparence entre un "mix" de dessins. Etant donné que le JToolTip est dessiné indépendemment du composant auquel il s'applique, j'aimerais savoir se l'opération peut tout de même être rendue possible. Peut-on récupérer la zone cachée par le tooltip ? getGraphics fait celà ?

  2. #2
    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
    Cela depend si le tooltip est heavyweight (AWT) ou lightweight (Swing). Dans le second cas, il suffit de dessiner le tooltip avec un AlphaComposite et le blending se fera automatiquement. Sinon il faut capturer ce qui va se trouver sous le tooltip avec la classe java.awt.Robot, dessiner l'image obtenue au fond du tooltip puis proceder comme dans le cas precedent avec un simple AlphaComposite.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Par défaut
    Citation Envoyé par Gfx
    Cela depend si le tooltip est heavyweight (AWT) ou lightweight (Swing). Dans le second cas, il suffit de dessiner le tooltip avec un AlphaComposite et le blending se fera automatiquement. Sinon il faut capturer ce qui va se trouver sous le tooltip avec la classe java.awt.Robot, dessiner l'image obtenue au fond du tooltip puis proceder comme dans le cas precedent avec un simple AlphaComposite.

    Il s'agit d'un JToolTip, et lorsque je dessine avec AlphaComposite le composant d'arrière plan est masqué par le tooltip. Rien ne se passe en d'autres termes...

  4. #4
    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
    Fais voir ton code. Sinon, utilise Robot comme je viens de le dire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    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
    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
     
    public class AsvToolTipUI extends BasicToolTipUI {
    	(...)
     
    	public void paint(Graphics g, JComponent c) {
    		Font font = c.getFont();
    		FontMetrics metrics = c.getFontMetrics(font);
    		Dimension size = c.getSize();
    		Insets insets = c.getInsets();
    		float alpha = 0.50f;
     
    		Graphics2D g2 = (Graphics2D)g;
     
                    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
     
    		if (c.isOpaque()) {
    			g2.setPaint(Color.RED);
    			g2.fillRect(0, 0, size.width, size.height);
    		}
     
    		g2.setColor(Color.BLACK);
    		g2.setFont(font);
     
    		// fix for bug 4153892
    		String tipText = ((JToolTip)c).getTipText();
     
    		if (tipText == nul	(...)l) {
    			tipText = "";
    		}
     
    		Rectangle paintTextR = new Rectangle(
                        insets.left,
                        insets.top,
                        size.width - (insets.left + insets.right),
                        size.height - (insets.top + insets.bottom));
     
    		View v = (View) c.getClientProperty(BasicHTML.propertyKey);
     
    		if (v != null) {
    			v.paint(g2, paintTextR);
    		} else {
    	    g2.drawString(tipText, paintTextR.x + 3, paintTextR.y + metrics.getAscent());
    	  }
    	}
     
    	(...)
    }
    EDIT: Voilà mes essais avec Robot, apparemment je m'en sers mal vu que je ne parviens pas à obtenir l'image.

    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
     
    public void paint(Graphics g, JComponent c) {
    		Font font = c.getFont();
    		FontMetrics metrics = c.getFontMetrics(font);
    		Dimension size = c.getSize();
    		Insets insets = c.getInsets();
    		float alpha = 0.50f;
     
    		Graphics2D g2 = (Graphics2D)g;
     
    		try {
    	  	Robot robot = new Robot();
    	  	BufferedImage img = robot.createScreenCapture(new Rectangle(
                        insets.left + 1,
                        insets.top + 1,
                        size.width - (insets.left + insets.right - 1),
                        size.height - (insets.top + insets.bottom) - 1));
        	        g2.drawImage(img, size.width - 1, size.height - 1, null);
    	  } catch (AWTException e) {
    	  }
     
    	  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
     
    		if (c.isOpaque()) {
    			g2.setPaint(c.getBackground());
    			g2.fillRect(0, 0, size.width, size.height);
    		}
     
    		g2.setColor(c.getForeground());
    		g2.setFont(font);
     
    		// fix for bug 4153892
    		String tipText = ((JToolTip)c).getTipText();
     
    		if (tipText == null) {
    			tipText = "";
    		}
     
    		Rectangle paintTextR = new Rectangle(
                        insets.left,
                        insets.top,
                        size.width - (insets.left + insets.right),
                        size.height - (insets.top + insets.bottom));
     
    		View v = (View) c.getClientProperty(BasicHTML.propertyKey);
     
    		if (v != null) {
    			v.paint(g2, paintTextR);
    		} else {
    	    g2.drawString(tipText, paintTextR.x + 3, paintTextR.y + metrics.getAscent());
    	  }
    	}

  6. #6
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    j'ai pas regarder le code mais
    1- tu pouvait continuer ici http://www.developpez.net/forums/sho...d.php?t=184871


    2-c'est une bonne idee de crer un ToolTipUI (tu voulait pas au debut).
    mais comme un toolTip est creer au niveau de la methode createToolTip() de ton Component, comment tu a fait pour faire un setUI sur le ToolTip ? Cette methode est protected
    tu a fait un ?

    UIManager.getDefaults().put("ToolTipUI", "MyToolTipUI");

    ou qchose dans le genre?

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2007, 11h17
  2. ajouter ou supprimer des composants Windows
    Par kovrov dans le forum Windows XP
    Réponses: 7
    Dernier message: 16/04/2007, 15h10
  3. [BorderLayout] Comment ajouter des dimensions aux composants ?
    Par jlassiramzy dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 27/12/2006, 14h48
  4. Réponses: 1
    Dernier message: 25/10/2006, 17h18

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