Une des fonctionnalités proposées lors de l’affichage du graphique est la possibilité d’y déplacer un curseur à l’aide de deux boutons/commandes << et >> et d’afficher à l’écran les valeurs correspondantes du cours.
La position du curseur dans le graphique est représentée par un entier i, qui est aussi l’indice du tableau des valeurs du graphique représenté. Par l’usage des boutons de direction, on incrémente ou décrémente cette valeur et on réaffiche le graphique. Cela est accompli par la méthode keyPressed() de javax.microedition.lcdui.Canvas que l’on surcharge comme ci-dessous.
protected void keyPressed(int keycode){
int gameAction = getGameAction(keycode);
if(gameAction == Canvas.LEFT){
this.avanceCurseur(-1);
} else if(gameAction == Canvas.RIGHT){
this.avanceCurseur(1);
}
}
avec
public void avanceCurseur(int sens){
if((this.iCurseur + sens > 0) && (iCurseur + sens < N-1)){
this.iCurseur += sens;
repaint();
}
}
Le réaffichage du graphique se fait par la méthode repaint() qui reconstruit l’écran en appelant la méthode paint() du composant affiché. Si l’on fait cela sans autre précaution, l’exécution de cette méthode va relancer tout le processus d’affichage, depuis calcul des diverses dimensions et échelles jusqu’à la « peinture » des fonds des graphiques, des cadres, des étiquettes et des courbes en elles-mêmes. Ce qui en résulte à l’affichage est un scintillement désagréable à chaque mouvement du curseur.
Pour pallier à ce désagrément, on décompose la construction du graphique en deux phases :
Cela concerne le fond et le cadre de la zone de traçage et les étiquettes d’affichage des valeurs. Ces dernières sont dessinées sur une image qui n’est plus modifiée par la suite. Au début de la méthode paint(), l’existence de cette « toile de fond » est testée et le cas échéant, initialisée (appel de la méthode initialiseGrille()) et la taille et la disposition des divers éléments est calculées. L’image est ensuite affichée sur l’écran. Lors des appels suivant de la méthode paint() via la méthode repaint(), l’image de fond n’est pas recalculée, mais simplement « collée » telle quelle (double buffering). Cette partie statique est donc rafraîchit beaucoup et on évite ainsi le scintillement.
Cela concerne le traçage des courbes et des histogrammes, du curseur et des valeurs affichées, qui sont dessinées sur l’image de fond pré dessinée. Ces éléments sont systématiquement retracés, les courbes à l’identique, le curseur selon sa nouvelle position et les valeurs en conséquence.
Remarque : les courbes pourraient elles aussi être dessinées sur l’image de fond, pour autant que nous ne souhaitions pas ajouter une fonctionnalité de zoom sur le graphique (pas réalisé ici).