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 :

Contour de Police


Sujet :

AWT/Swing Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut Contour de Police
    Salut à tous.

    J'aimerais savoir s'il est possible de déterminer un style (ou simplement une couleur) de contour sur les caractères d'un JLabel ou d'un JButton. Par exemple, avoir le texte en noir avec un contour de lettres en rouge.
    J'ai cherché du côté de la classe Font, mais à part italique et gras, je n'ai pas trouvé grand chose au niveau personnalisation du style, et pour ce qui est des composants précités (JLabel et JButton), j'arrive à changer leur bordure générale, mais sans plus...
    Bon, c'est pas ce qu'il y a de plus important, hein, mais c'est pour finaliser le style de mon application.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de eclesia
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    2 111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 111
    Par défaut
    tu as d'avantage d'attributs sur la classe "Font", mais il faut les manipuler différaments

    tu as une liste des attributs avec getAvailableAttributes();

    mais je ne pense pas que tu ai le contour des lettres dedans désolé.

  3. #3
    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
    Pour faire cela il te faudra dessiner le texte à la main en utilisant un TextLayout et une Stroke appropriée.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut
    Okay, ben merci.
    Je vais creuser un peu de ce côté-là et je vous tiendrais au courant
    J'attends de voir si c'est bricolable facilement avant de passer en résolu...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10
    Par défaut
    Pour l'instant, vu mon niveau d'anglais et celui de complication que je pressens dans l'utilisation du TextLayout et ce qui va avec, je me suis orienté vers la "solution" un peu plus fantaisiste et encore à affiner suivante:
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
     
    public class Test {
    	public static void makeBorderedFont(JButton button, Color border, float size) {
    		Font font = button.getFont();
    		Color color = button.getForeground();
    		String text = button.getText();
    		BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    		int width = img.getGraphics().getFontMetrics(font).stringWidth(text);
    		int height = img.getGraphics().getFontMetrics(font).getHeight();
    		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g2d = (Graphics2D)img.getGraphics();
    		g2d.setFont(font);
    		g2d.setColor(border);
    		g2d.drawString(text,size,height/2F+size);
    		g2d.drawString(text,-size,height/2F-size);
    		g2d.setColor(color);
    		g2d.drawString(text,0,height/2);
    		g2d.dispose();
    		button.setText(null);
    		button.setIcon(new ImageIcon(img));
    	}
    	public static void makeBorderedFont(JLabel label, Color border, float size) {
    		Font font = label.getFont();
    		Color color = label.getForeground();
    		String text = label.getText();
    		BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    		int width = img.getGraphics().getFontMetrics(font).stringWidth(text);
    		int height = img.getGraphics().getFontMetrics(font).getHeight();
    		img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g2d = (Graphics2D)img.getGraphics();
    		g2d.setFont(font);
    		g2d.setColor(border);
    		g2d.drawString(text,size,height/2F+size);
    		g2d.drawString(text,-size,height/2F-size);
    		g2d.drawString(text,-size,height/2F+size);
    		g2d.drawString(text,size,height/2F-size);
    		g2d.setColor(color);
    		g2d.drawString(text,0,height/2);
    		g2d.dispose();
    		label.setText(null);
    		label.setIcon(new ImageIcon(img));
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Test");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		JLabel label = new JLabel("Label", JLabel.CENTER);
    		label.setFont(new Font("Arial", Font.PLAIN, 22));
    		label.setForeground(Color.WHITE);
    		makeBorderedFont(label, Color.GREEN, 1.2F);
    		frame.getContentPane().add(label, BorderLayout.WEST);
    		JButton button = new JButton("Bouton");
    		button.setFocusPainted(false);
    		button.setFont(new Font("Papyrus", Font.BOLD|Font.ITALIC, 20));
    		button.setForeground(Color.BLACK);
    		makeBorderedFont(button, Color.RED, 1F);
    		frame.getContentPane().add(button, BorderLayout.EAST);
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
    	}
    }
    Je n'ai pas encore testé "en vrai" dans mon projet, mais cette classe de test me donne un résultat pas loin d'être sympathique ^^
    Images attachées Images attachées  

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 911
    Billets dans le blog
    54
    Par défaut
    Houla, je n'aurais pas fait ca comme ca mais plutot avec le GlyphVector pour recuperer les formes des caracteres formant le texte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GlyphVector gv = font.createGlyphVector(g2d.getFontRenderContext(), text);
    A tester, fusionner toutes les formes dans une meme Area pour avoir un contour continu autour de la chaine plutot que des contours separes pour chacun des glyphes.

    EDIT - meme pas besoin en fait tu as directement la methode getOutline() dans la classe GlyphVector.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    package test;
     
    import java.awt.*;
    import java.awt.font.*;
    import javax.swing.*;
     
    /**
     * <p>Title: </p>
     *
     * <p>Description: </p>
     *
     * <p>Copyright: Copyright (c) 2006</p>
     *
     * <p>Company: </p>
     *
     * @author not attributable
     * @version 1.0
     */
    public class TestStringOutline extends JPanel {
      private String text = "Hello world ! ";
      private Font font = new Font("Dialog", Font.BOLD, 70);
      private Stroke lineStroke = new BasicStroke(1.0f);
      private Stroke dashedStroke = new BasicStroke(5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, new float[] {5, 10}, 0);
     
      public TestStringOutline() {
      }
     
      /**
       * {@inheritDoc}
       */
      @Override protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Insets insets = getInsets();
        Dimension size = getSize();
        Graphics2D g2d = (Graphics2D) graphics.create(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom));
        try {
          g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          g2d.setFont(font);
          GlyphVector gv = font.createGlyphVector(g2d.getFontRenderContext(), text);
          Shape outline = gv.getOutline();
          g2d.translate(50, 100);
          g2d.setColor(Color.BLACK);
          g2d.fill(outline);
          g2d.setStroke(lineStroke);
          g2d.setColor(Color.CYAN);
          g2d.draw(outline);
          g2d.setStroke(dashedStroke);
          g2d.setColor(Color.RED);
          g2d.draw(outline);
          g2d.translate( -100, -100);
        }
        finally {
          g2d.dispose();
        }
      }
     
      /** Self-test main.
       *  @param args Arguments from the command-line.
       */
      public static void main(String ...args) {
        SwingUtilities.invokeLater(new Runnable() {
          /**
           * {@inheritDoc}
           */
          public void run() {
            JFrame frame = new JFrame("Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new BorderLayout());
            frame.add(new TestStringOutline(), BorderLayout.CENTER);
            frame.setSize(500, 400);
            frame.setVisible(true);
          }
        });
      }
    }
    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

  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
    C'est ce que donne aussi TextLayout.

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 911
    Billets dans le blog
    54
    Par défaut
    Mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TextLayout tl = new TextLayout(text, font, g2d.getFontRenderContext());
    Shape outline = tl.getOutline(null);
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GlyphVector gv = font.createGlyphVector(g2d.getFontRenderContext(), text);
    Shape outline = gv.getOutline();
    pour utiliser TextLayout. Voir l'exemple dans la doc de LineBreakMeasurer pour le support d'un texte s'etalant sur plusieurs lignes.
    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

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Bonjour,

    Je me permet de remonter le topic car j'aimerais utiliser ce code pour un bouton. Par contre je suis un peu largué concernant son utilisation/intégration .

    Serait-il possible d'avoir des précisions?

    Merci.

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 911
    Billets dans le blog
    54
    Par défaut
    Dans un JButton ? erf il va falloir aller bidouiller/interferrer dans le code de dessin de l'UI.

    Tu peux dejà aller voir dans le code source de BasicButtonUI et MetalButtonUI (fichier src.zip à la racine du JDK) mais bon après le code des ui propres au lnf du système n'est pas dispo.

    Une idée serait de t'arranger pour rendre un bouton vide (sans texte mais à la bonne taille) et de dessiner toi même le temps en surchargeant paint Component().

    Idée à la con dont je n'ai aucune idée si elle marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
     * {@inheritDoc}
     */
    @Override
    protected void paintComponent(Graphics g) {
      Color foreground = getForeground();
      setForeground(new Color(0, 0, 0, 0)); // Faire que le texte original soit dessiné en transparent.
     super.paintComponent(g);
     // Essayer de rendre le texte ici.
     setForeground(foreground);
     [...]
    }
    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

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 287
    Par défaut
    Argh, en clair va falloir que je me pose dessus un long moment pour peut être ne pas avoir de résultat
    je ferais cela dés que j'aurais un peu d'avance.

    Dans tous les cas, merci pour la réponse.

Discussions similaires

  1. Intégrer un contour sur une police
    Par Viish dans le forum Android
    Réponses: 6
    Dernier message: 09/02/2010, 09h12
  2. [FLASH MX2004] Contour de police
    Par kephy dans le forum Flash
    Réponses: 2
    Dernier message: 06/10/2005, 13h05
  3. Réponses: 5
    Dernier message: 27/11/2002, 14h08
  4. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  5. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

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