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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 901
    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 901
    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

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