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

  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?

  7. #7
    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
    Note : Pour que cela marche il faut que le isOpaque() du tooltip retourne false.

  8. #8
    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 bbclone
    Oui mais cette méthode peut être appliquée à d'autres composants qu'un tooltip alors c'est pas plus mal de créer un nouveau topic.

    Citation Envoyé par bbclone
    2-c'est une bonne idee de crer un ToolTipUI (tu voulait pas au debut).
    Oui mais j'ai vu un tooltip transparent et ça m'a inspiré donc pour en créer un il fallait que je passe obligatoirement par un ToolTipUI.

    Citation Envoyé par bbclone
    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");
    J'ai créé mon propre tooltip qui extends JToolTip et qui redéfinit updateUI (comme expliqué dans un des posts où tu en parlais parce que je vais être amené à utiliser ce tooltip que dans certaines parties du code, donc d'un point de vue: clarté de code je préfère.

    Citation Envoyé par Gfx
    Note : Pour que cela marche il faut que le isOpaque() du tooltip retourne false.
    Dans ma classe qui étend JToolTip j'ai donc redéfini isOpaque():

    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
     
    public class AsvToolTip extends JToolTip {
     
    	public AsvToolTip() {
    		updateUI();
    	}
     
    	public void updateUI() {
    		setUI(AsvToolTipUI.createUI(this));
    	}
     
    	public boolean isOpaque() {
    		return false;
    	}
    }
    EDIT: Apparemment ça marche mais je ne sais pas sur quel élément se fait la superposition vu que tout devient GRIS !

    PS: Est-ce que ma méthode avec robot est bonne ?

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