Traduction officieuse du tutorial de Michael
Martak. Dont je n'ai pas trouvé
l'e-mail: si ca dérange quelqu'un, je veux bien enlever
cette traduction.
La version originale est sur
java.sun.com
(et ici un zip contenant la
traduction pour la regarder offline )
Comme cité précédemment, la plupart des applications fonctionnent mieux si elles commandent le dessin. Dans une application traditionnelle possédant GUI (Graphical User Interface), la question « quand peindre ? » est habituellement laisser à l'OS. Lorsqu'on travaille dans un environnement avec des fenêtres, cela prend tout son sens. Une fenetre d'application ne sait pas si l'utilisateur est en train de bouger, redimmensionner ou cacher une application par une autre fenêtre jusqu'à ce que ça arrive. Dans une application Java graphique, l'OS delivre une paint event à l'AWT, qui calcule ce qui doit être peint, crée un objet java.awt.Graphics avec la taille appropriée, puis appelle la méthode paint avec cet objet Graphics.
// Traditional GUI Application paint method: // This can be called at any time, usually from the event dispatch thread public void paint(Graphics g) { // Use g to draw my Component }
Cela est souvent désigné par rendu passif ( passive rendering). Comme vous pouvez l'imaginer, ce système implique un « sur-traitement » qui ennuiera grandement les programmeurs AWT et Swing soucieux des perfomances.
En mode plein écran, vous n'avez plus à vous soucier de savoir si la fenêtre est en train d'être redimensionnée, etc.. (à moins que vous n'ayez ignoré ma suggestion de désactivé le redimmensionnement). A la place, la fenêtre est dessinée directement à l'écran (rendu actif, active rendering). Cela simplifie un peut le dessin, puisque vous n'avez plus à vous soucier des paint events. En fait, les paint events délivrées par l'OS peuvent même l'être à des moments inappropriés ou imprévisibles en mode plein écran.
Au lieu de se fier à la la méthode paint en mode plein écran, le code de dessin ,drawing code, est habituellement fait dans une boucle de rendu, rendering loop:
public void myRenderingLoop() { while (!done) { Graphics myGraphics = getPaintGraphics(); // Draw as appropriate using myGraphics myGraphics.dispose(); } }
Une telle boucle de rendu peut être faite depuis n'importe quel thread, que ce soit le sien propre ou en profitant du thread principal de l'application.
Quelques astuces à propos de l'utilisation du rendu actif:
Ne mettez pas le code de dessin dans la routine paint.Vous ne pourriez pas savoir quand cette routine sera appelée! A la place, utilisez un autre nom de méthode, tel que render(Graphics g), qui pourra être appelée depuis la méthode paint si le mode fenêtre est utilisé, ou alors appelée avec son propre graphics depuis la boucle de rendu.
Utilisez la méthode setIgnoreRepaint sur vos fenetre et composants pour désactiver les paint events lancés par l'OS, puisque celles-ci peuvent être appelées à des moments inappropriés, ou pire, finir en appelant paint, ce qui peut mener les conditions entre le thread d'évênement de l'AWT et votre boucle de rendu à se
à your application window and components to turn off all paint events dispatched from the operating system completely, since these may be called during inappropriate times, or worse, end up calling paint, which can lead to race conditions between the AWT event thread and your rendering loop.
Séparez votre code de dessin de votre boucle de rendu, de telle sorte que vous pouvez « opérer » que ce soit en mode plein écran ou en mode fenêtre.
Optimisez votre rendu afin de ne pas tout redessiner sur l'écran à chaque fois (à moins que vous utilisiez le page-flipping ou le double buffering, décrit un peu plus loin)
Ne vous fiez pas aux méthodes update ou repaint pour traiter les évênement graphiques (paint events).
N'utilisez pas de composents lourds, puisque ceux-ci implique encore un « sur-traitement » impliquant l'AWT et le système de fenêtres.
Si vous utilisez des composents légers, tels que les composants Swing, vous devrez peut-être les manipuler un peu pour qu'ils se dessinent en utilisant votre Graphics, et non après l'appel de la méthode paint. Sentez vous libre d'appeler les méthodes Swing telles que paintComponents, paintComponent, paintBorder, et paintChildren directement depuis votre boucle de rendu.
Sentez vous libre d'utiliser le rendu passif si vous voulez juste une application Swing ou AWT en plein écran, mais rappelez vous que les paint events peuvent ne pas être fiables ou nécessaires. De plus, si vous utilisez le rendu passig, vous ne serez pas en mesure d'utiliser des techniques avancées comme le page-flipping. Finalement, faites très attention à éviter les bloquages si vous décidez d'utiliser simultanément les rendus passif et actif--cette approche n'est pas recommandée.