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

2D Java Discussion :

Centrer un drawString


Sujet :

2D Java

  1. #1
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut Centrer un drawString
    Bonjour tout le monde et bonjour Joel.
    En fait je n'arrive pas a centrer un drawString dans un fillRoundRect.
    Surtout si le tout subit des changements de taille.

    Mon problème vient du fait que le point 0,0 de drawString est en bas a gauche, et que celui de fillRoundRect est en haut a gauche.

    Alors peut-être que ma façon de faire n'est pas la plus simple, dans ce cas je suis tout ouïe.
    Merci de votre aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Bonsoir
    Peux-tu poster le code de ta classe et nous indiquer les endroits où ça cloche ?
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  3. #3
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Panel.feuille.setColor(Color.white);
    Panel.feuille.fillRoundRect(0, 0, 50, 20, 10, 10);
     
    Panel.feuille.setColor(Color.black);
    Panel.feuille.drawString(profilName, ???, ???);
    Voila je sais pas quoi mettre là dedans "???" pour que ce soit centrer en hauteur et largeur dans fillRoundRect.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    fillRoundRect et drawString sont des méthodes de Graphics2D ?
    Si oui comment tu les appelles (code de Panel.feuille)
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  5. #5
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static Graphics2D feuille;
     
    public void paintComponent(Graphics g){
    feuille = (Graphics2D)g;
    feuille.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
    feuille.setFont(new Font("DIN Condensed", Font.BOLD, 15));
    feuille.dispose();
    }
    Tout ca c'est dans Panel.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Eux, pourquoi sortir le contexte graphics dans une variable à état et l'appeler de l'extérieur ? Static en plus ! Que tu disposes avant même de t'en servir ! C'est n'importe quoi... Tout ton code avec des Panel.feuille.xxx doit être dans la méthode paint, et ce sont les variables que tu manipules (texte, coordonnées,...) qui doivent être en variables de classe (non statique, jamais). Tu les modifies avec des setters, et tu fais repaint() pour rafraîchir l'affichage.

    Quoiqu'il en soit, pour centrer, c'est que tu peux connaitre l'espace que prend une String, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FontMetrics fontMetrics = g2d.getFontMetrics();
    Rectangle2D textBounds = fontMetrics.getStringBounds(STRING, g2d);

    Le principe, c'est que à partir du moment où tu connais l'espacement pris par le texte, et l'espacement de là où tu veux l'afficher, tu peux centrer l'un par rapport à l'autre, avec la formule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     xcentre = xforme + (largeurtexte - largeurforme)/2
    pareil pour les y, mais sur les coordonnées et dimensions respectives.

    Pour le centrage horizontal, ça suffit. Par contre, pour le centrage vertical, c'est un peu plus compliqué, parce qu'un texte ne se dessine pas exactement au y que tu donnes : c'est sa baseline qui est au y que tu donnes.


    Voici un extrait de code, que j'ai pris rapidement d'une de mes méthodes qui permet d'aligner un texte dans le cas général, en tenant compte de la baseline (donc un texte bottom n'est pas collé contre le bord en bas, idem pour un texte en top, mais au moins, si tu as plusieurs rectangles avec plusieurs textes, ce sera harmonieux.


    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
    76
    77
    78
    79
    80
    81
    82
    83
    public class CenterText extends JPanel {
     
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater( ()->demo( new CenterText(SwingConstants.CENTER,SwingConstants.CENTER) ) );
     
    	}
     
    	private static void demo( final CenterText centerText ) {
    		final JFrame frame = new JFrame( "Démo" );
    		frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    		frame.setSize( 300, 300 );
    		frame.setLocationRelativeTo( null );
    		frame.getContentPane().add( centerText );
     
    		frame.setVisible(true);
    	}
     
    	private final static String STRING = "Démo";
     
    	private final int halign;
    	private final int valign;
     
    	public CenterText(int halign, int valign) {
    		this.halign=halign;
    		this.valign=valign;
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
     
    		super.paintComponent(g);
    		Graphics2D g2d = (Graphics2D)g;
    		FontMetrics fontMetrics = g2d.getFontMetrics();
     
    		g2d.setColor(Color.YELLOW);
    		g2d.fillRoundRect(10, 10, 100, 50, 5, 5);
    		Rectangle2D bounds = new Rectangle2D.Double(10d, 10d, 100d, 50d);
     
     
    		g2d.setColor(Color.BLUE);
     
    		Rectangle2D textBounds = fontMetrics.getStringBounds(STRING, g2d);
     
    		double textWidth = textBounds.getWidth();
     
    		double x,y;
     
    		switch (halign) {
    		case SwingConstants.LEFT:
    			x = bounds.getX();
    			break;
    		case SwingConstants.RIGHT:
    			x = bounds.getX() + bounds.getWidth() - textWidth;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			x = bounds.getX()
    			+ (bounds.getWidth() - textWidth) / 2;
    			break;
    		}
    		switch (valign) {
    		case SwingConstants.TOP:
    			y = bounds.getY() + fontMetrics.getAscent() - fontMetrics.getDescent();
    			break;
    		case SwingConstants.BOTTOM:
    			y = bounds.getY()
    			+ bounds.getHeight()  - fontMetrics.getDescent() ;
    			break;
    		case SwingConstants.CENTER:
    		default:
    			y = bounds.getY()
    			+ bounds.getHeight()/ 2  - ( ( fontMetrics.getAscent() + fontMetrics.getDescent() ) / 2 ) + fontMetrics.getAscent()  ;
    			break;
    		}	 
     
     
    		g2d.drawString(STRING, (int)x, (int)y);
     
    	} 
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Ca marche d'enfer.
    Merci.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

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

Discussions similaires

  1. [CR9] Centrer verticalement le texte
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 22/05/2009, 19h33
  2. centrer un drawstring
    Par hamster. dans le forum Graphisme
    Réponses: 1
    Dernier message: 26/12/2007, 15h46
  3. Centrer une feuille sur l'ecran ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/06/2003, 14h11
  4. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  5. Centrer un texte dans un string Grid
    Par christine dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/10/2002, 22h33

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