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 :

Question sur l'utilisation de FontMetrics


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    HNT
    HNT est déconnecté
    Membre éclairé Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Par défaut Question sur l'utilisation de FontMetrics
    Bonjour,

    Dans le cadre d'un cours de GUI, nous avons reçu quelque notion de base de programmation événementielle.
    Lors d'un exercice, on nous demande de faire se déplcaer du texte dans un JPanel (facile), il part de la gauche, va vers la droite, touche le bord de la JFrame et reviens en sens inverse, ainsi de suite à l'infini.

    Bon pour détecter qu'il ne dépasse pas du bord de la frame, j'ai une condition du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (this.horizontalPosition + HORIZONTAL_INCREMENT < this.getWidth() - TAILLE_STRING)
    TAILLE_STRING est une constante qui vaut 100.
    Je trouve franchement mauvais de fixer la taille de la string car celle-ci peut changer, justement, selon la fonte.
    Voici mon le code du JPanel :
    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
     
    public class AnimationPanel extends JPanel implements ActionListener
    {
    	private boolean recule;
    	private int horizontalPosition;
    	private static final String MESSAGE = "message moving ?";
    	private static final int SECONDE = 1000;
    	private static final int VERTICAL_POSITION = 25;
    	private static final int HORIZONTAL_INCREMENT = 15;
        private static final long serialVersionUID = 665225988771169362L;
    	private static final int TAILLE_STRING = 100;
     
        public AnimationPanel()
        {
        	this.recule = false;
        	this.horizontalPosition = 3;
        	new Timer(SECONDE, this).start();
        }
     
        protected void paintComponent(Graphics g)
        {
        	super.paintComponent(g);
        	g.drawString(MESSAGE, this.horizontalPosition, VERTICAL_POSITION);
        }
     
    	public void actionPerformed(ActionEvent e)
        {
    		if (this.horizontalPosition - HORIZONTAL_INCREMENT > 0 && recule)
    			this.recule = true;
    		else if (this.horizontalPosition + HORIZONTAL_INCREMENT < this.getWidth() - TAILLE_STRING && !recule)
    			this.recule = false;
    		else
    			this.recule = true;
    	    this .horizontalPosition += this.recule ? -HORIZONTAL_INCREMENT : HORIZONTAL_INCREMENT;
    	    this.repaint();
    Bon, on peut remplacer TAILLE_STRING par une variable obtenue comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int tailleChaine = this.getGraphics().getFontMetrics().stringWidth(MESSAGE);
    Ca c'est deja mieux mais le seul endroit ou je peut le mettre est dans la méthode actionPerformed, si je met cette variable dans le constructeur il y a deux possibilitée : soit je la met avant le timer et alors l'objet ,'as pas encore été peint, résutat, une nullpointer; soit le la met après le timer et alors il estdéjà starté et j'ai deja besoin de la variable alors qu'elle n'est pas encore initalisé.

    Donc actuellement, la métode actionPerformed est le seul endroit ou je peut faire cette initalisation, mais c'est peut optimiser, vu que sa valeur ne change pas. N'y aurait-il pas un autre moyen pour ne faire qu'une fois l'initalisation ?

  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
    Est-il nécessaire d'optimiser ? Sinon tu peux bêtement faire une lazy intialization :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private int tailleString = -1;
     
    public void actionPerformed(ActionEvent e) {
      if (tailleString == -1) {
        tailleString = getGraphics().getFontMetrics().stringWidth(MESSAGE);
      }
      // reste du code...
    }

  3. #3
    HNT
    HNT est déconnecté
    Membre éclairé Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Par défaut
    Ben c'est clair que ça va surement pas bouffer toute mes ressources. Mais d'un autre coté, je trouve que c'est plus propre (car, par définition, ça servait vraiment à rien de le recalculer à chaque passage)

    Merci pour la réponse.

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

Discussions similaires

  1. Question sur l'utilisation de wget
    Par berry dans le forum Réseau
    Réponses: 7
    Dernier message: 24/05/2007, 22h46
  2. Question sur l'utilisation du popupMenu
    Par Jayceblaster dans le forum Delphi
    Réponses: 2
    Dernier message: 25/07/2006, 10h59
  3. question sur l'utilisation d'une listBox
    Par Mickey.jet dans le forum Delphi
    Réponses: 3
    Dernier message: 02/06/2006, 17h57
  4. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20
  5. [Framework] Questions sur l'utilisation de spring
    Par mlequim dans le forum Spring
    Réponses: 10
    Dernier message: 01/02/2006, 15h27

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