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 :
TAILLE_STRING est une constante qui vaut 100.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (this.horizontalPosition + HORIZONTAL_INCREMENT < this.getWidth() - TAILLE_STRING)
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 :
Bon, on peut remplacer TAILLE_STRING par une variable obtenue comme suit :
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();
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é.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int tailleChaine = this.getGraphics().getFontMetrics().stringWidth(MESSAGE);
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 ?
Partager