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 :

Centrer un chiffre dans une case de sudoku


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut Centrer un chiffre dans une case de sudoku
    Bonjour,

    Je travaille sur un projet de sudoku, et j'essaie de centrer le chiffre dans la case, pour cela, j'ai besoin de connaitre la hauteur du caractère à afficher. Mais le problème est que les fonctions de fontmetrics permettent de récupérer la longueur d'un texte facilement (stringWidth) mais lorsqu'il s'agit de la hauteur, il s'entête à donner la hauteur minimale nécessaire pour afficher n'importe quel caractère de la Font, mais moi, je veux la hauteur d'un caractère spécifique (j'ai essayé avec FontMetrics.getStringBounds(), mais ça donne le même résultat.

    Voilà, j'espère que quelqu'un à une solution à ça.

    Je pense pas que ce sujet à été adressé dans ce forum car je n'ai pas pu le trouver sur d'autres sites, cela dit, je n'ai pas pu faire une recherche précise car je ne sais pas comment est représenté le concept de 'ET' dans une chaine de recherche sur le forum developpez.

    Merci

  2. #2
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Ca ne repondra pas directement a ta question, mais ne serait il pas plus simple d'utiliser un JLabel ou un JTextField pour faire ta case ?

    setHorizontalAlignment(javax.swing.JTextField.CENTER);
    setVerticalAlignment(javax.swing.JTextField.CENTER);
    Et on n'en parle plus !

    J'ai juste l'impression que t'essayes de faire un peu compliqué là

  3. #3
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut
    Citation Envoyé par n!co

    J'ai juste l'impression que t'essayes de faire un peu compliqué là
    lol on me dit souvent ça ouais .

    Bon, en tout cas merci pour la réponse, mais en fait, j'ai pas envie d'utiliser un JLabel car je n'affiche pas forcément un seul chiffre dans la case, seulement lorsque la valeur est sensée être dévoilée, mais sinon, je veux aussi pouvoir afficher les valeurs candidates de la case dans une certaine disposition pas offerte par le JLabel, enfin, voilà, de toutes façons, ça me parait vraiment dommage qu'il n'y ait pas de méthode permettant de retourner la hauteur du dessin effectif d'un caractère spécifique...


    (edit)OOhhhhh mais d'ailleurs, pour pouvoir centrer le texte JLabel doit contenir la solution ! je suis bête, bon, si la trouve dans les fins fonds (orthographe?) du code source de swing, je la poste ici.

    (edit 2) voilà, donc, l'utilisation d'un Jlabel n'aurait pas amélioré le problème car ils font la même chose que moi, dans BasicLabelUI.paint() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int textY = paintTextR.y + fm.getAscent();
    ils ajoutent juste l'ascent qui est la hauteur supérieure à tous les Ascent de la Font en cours (Ascent = ce qui est dessiné en dessus de la baseline (baseline = la ligne de la base de l'affichage du texte que quelques caractères comme p, ou q, dépassent))

  4. #4
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    ici.

    [EDIT] Et il y a un sujet plus complet ici.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Par défaut
    ok, merci xavlours, l'autre post contenait en effet la solution pour mon problème (solution = utilisation d'un textLayout)

    mais je vais quand même poster ma solution car j'ai réglé en même temps un autre problème lié au fait que certains caractères de certaines polices ne sont pas dessinés à hauteur de la baseline mais plus haut (exposant par exemple...)

    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
     
     
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.font.FontRenderContext;
    import java.awt.font.TextLayout;
     
    import sun.font.FontDesignMetrics;
     
    /**
     * Permet de récupérer les mesures exactes du dessin d'un caractère
     * 
     * L'utilité principale de cette classe est le dessin d'un caractère centré de
     * manière absolue (et non pas par rapport à l'ascent qui est la hauteur
     * minimale permettant de contenir n'importe quel caractère d'une police donnée)
     * 
     * @author Sam
     * 
     */
    public class MesuresDessinCaractere
    {
    	private int hauteurEffective;
     
    	private int avancementNecessairePourCentrer;
     
    	private int largeurEffective;
     
    	public MesuresDessinCaractere(String c, FontMetrics fm, Graphics g)
    	{
    		FontRenderContext context = ((FontDesignMetrics) fm).getFRC();
    		TextLayout layout = new TextLayout(c, fm.getFont(), context);
     
    		largeurEffective = fm.stringWidth(c);
     
    		// La hauteur exacte du dessin du caractère
    		hauteurEffective = (int) layout.getBounds().getHeight();
     
    		// On calcule la marge entre le bas du dessin et la baseline car
    		// certaines, comme Opus Chord, insèrent un blanc en dessous du dessin
    		// du caractère pour les mettre plus haut que la baseline
    		// (je réutilise ici les valeurs exactes (virgule flottante) car il y a
    		// une imprécision entre les deux valeurs : pour une police 'normale' on
    		// a
    		// 0 < (-layout.getBounds().getY() - layout.getBounds().getHeight) < 0.5
    		// (donc l'imprecision peut être corrigée avec round)
    		// et l'imprécision n'est pas supérieure pour les polices 'pas
    		// normales'(caractères pas dessinés sur la baseline)
    		int margeBaselineBasDessin = (int) Math.round(-layout.getBounds()
    				.getY()
    				- layout.getBounds().getHeight());
     
    		// Dans le cas exposé précédemment, il nous faut donc avancer la
    		// baseline si on veut que le texte soit écrit au même niveau que les
    		// autres
    		avancementNecessairePourCentrer = margeBaselineBasDessin
    				+ hauteurEffective / 2;
     
    	}
     
    	public int getHauteurEffective()
    	{
    		return hauteurEffective;
    	}
     
    	public int getLargeurEffective()
    	{
    		return largeurEffective;
    	}
     
    	/**
             * Retourne l'avancement en nombre de pixels qu'il faut ajouter à la
             * position 'baseline'
             * 
             * @return
             */
    	public int getAvancementNecessairePourCentrer()
    	{
    		return avancementNecessairePourCentrer;
    	}
    }
    (edit : j'ai corrigé un peu le code pour une imprécision, (expliqué dans le code))

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

Discussions similaires

  1. Centrer un bouton radio dans une case de grille.
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 11/01/2016, 13h41
  2. Lettre et chiffre dans une même case mémoire
    Par isrdum dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/05/2012, 03h58
  3. [Débutant] afficher des infos quand on entre des chiffres dans une case
    Par xingjing910 dans le forum VB.NET
    Réponses: 12
    Dernier message: 26/03/2012, 10h59
  4. Centrer un texte dans une page
    Par Samanta dans le forum Mise en forme
    Réponses: 5
    Dernier message: 20/09/2010, 22h30
  5. Centrer le texte dans une TStringGrid
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/06/2004, 11h01

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