Pour commencer à exécuter les exemples donnés dans cet article, vous avez besoin de JDK 1.2 ou supérieur ( http://java.sun.com ). Vous aurez également besoin d'un serveur Web prenant en charge JSP. J'ai testé cet exemple sur Tomcat, où j'ai utilisé la classe com.sun.image.codec.jpeg (publiée dans le SDK Sun Java 2) pour encoder les données graphiques.
Puisque vous souhaitez disposer d'arrière-plans réutilisables, vous devez créer une classe Java pour gérer la mise en page, y compris la zone de titre et les bordures extérieures. Comme le montre la figure A.
Figure A
Comme vous pouvez le constater, j'ai ombré la zone de titre et la bordure extérieure. Le titre a une bordure blanche d'un pixel de large et la zone graphique a une fine bordure noire. Ces bordures ajoutent de la définition aux ombres.
Les limites sont faciles à créer. Utilisez la méthode Fill() de l'objet Graphics2D pour remplir un rectangle de titre bleu, puis utilisez la méthode draw() pour dessiner la bordure avec une autre couleur.
Créer un effet d'ombre est également très simple. Tout d’abord, utilisez la méthode fill() pour dessiner une ombre. Ensuite, dessinez le titre avec un décalage de sept pixels. Ce décalage crée un effet tridimensionnel, qui se traduit par un effet d'ombre.
Supposons qu’il existe une entreprise qui vend des produits agricoles et qu’elle ait besoin d’un histogramme pour afficher ses ventes. Dans une application pratique, nous aurions besoin d'obtenir ces données à partir d'une base de données ou d'un fichier XML, mais pour plus de simplicité, supposons que les données de ventes soient stockées dans les deux tableaux suivants :
String datanames[] = {"pomme", "orange", "pêche", "citron", "pamplemousse"} ;
int valeurs de données[] = {11, 62, 33, 102, 50} ;
Le premier tableau contient des articles pour divers produits agricoles vendus par l'entreprise. Le deuxième tableau est le volume des ventes correspondant à chaque produit agricole.
L'histogramme sera affiché et enregistré au format JPEG, nous devons donc définir correctement le MIME, le type de contenu. Les navigateurs utilisent les types MIME pour décider comment réagir. Le code suivant définit le type MIME :
réponse.setContentType("image/jpeg");
Ensuite, nous avons besoin d'un objet qui représente l'image. L'API Java 2D prend en charge la classe BufferedImage , qui permet d'enregistrer et de gérer les données de pixels en mémoire. Nous voulons que les graphiques soient en couleur, nous utilisons donc le type graphique TYPE_INT_RGB . Les deux données entières WIDTH et HEIGHT permettent de préciser la largeur et la hauteur de l'image en pixels :
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Maintenant que nous avons un objet BufferedImage, nous pouvons définir le contenu de Graphics2D en appelant la méthode createGraphics() de l'objet :
Graphics2D biContext = bi.createGraphics();
Le programmeur qui a créé le graphique doit définir le paramètre WIDTH en fonction de l'importance du graphique et de la disposition globale de la page. Les éléments graphiques se redimensionnent automatiquement en fonction des changements de largeur graphique.
La largeur et la zone de délimitation du titre, ainsi que le carré droit le plus long du graphique, doivent être calculés en fonction du paramètre WIDTH . Le but est de garantir que tous les éléments graphiques ne dépassent pas la largeur du graphique et ne traversent pas la bordure droite du graphique.
Le nombre d'éléments de données qui doivent être affichés détermine le paramètre HEIGHT du graphique. Si de nouveaux éléments sont ajoutés aux tableaux datavalues[] et datanames[] , la hauteur du graphique doit augmenter en conséquence pour s'adapter à la taille de la zone d'affichage requise.
Le paramètre maximum est utilisé pour le carré droit le plus long. Ensuite, les largeurs des autres blocs rectangulaires sont calculées par rapport au maximum :
int barWidth = (innerWIDTH * currentValue) / maximum ;
L'algorithme ci-dessus utilise les deux valeurs de maximum et de innerWIDTH (zone graphique) du graphique pour garantir que le rectangle se développera et se contractera automatiquement à mesure que la valeur de WIDTH change.
Afin d'afficher le graphique, nous devons créer une image d'arrière-plan, puis ajouter les données graphiques. Tout d’abord, créez un objet graphBG et appelez sa méthode draw() :
graphBG gr = nouveau graphBG();
gr.draw(biContext, WIDTH, HEIGHT, "Produits agricoles", "Moyenne globale : " + moyenne);
Les paramètres de la méthode draw() incluent le contenu graphique, biContext , WIDTH et HEIGHT , que la classe graphBG utilise pour déterminer la largeur et la hauteur du titre et de la zone graphique. Enfin, la valeur moyenne des données est calculée et ajoutée au texte affiché dans le titre.
La position des coordonnées verticales (axe y) de chaque bloc rectangulaire est calculée selon la formule suivante : y_pos = i * displayHeight + headerOffset . displayHeight est égal à la hauteur du texte sur le carré droit plus la hauteur du carré droit, et headerOffset représente la distance verticale depuis le haut du graphique, y compris la hauteur de la zone de titre et de l'ombre.
J'ai créé ces rectangles et leurs bordures en utilisant la même technique que celle utilisée précédemment pour créer les bordures du titre. J'ai soustrait un pixel de la largeur et de la hauteur des bordures du rectangle pour que chaque rectangle apparaisse avec une bordure rouge, et j'ai facilité l'effet de soustraction en dessinant les bordures intérieures sur un fond blanc.
Nous avons créé l'image en mémoire, maintenant nous l'encodons et l'affichons à l'utilisateur. Nous ne pouvons pas utiliser le flux de sortie JSP par défaut pour traiter JPEG, nous devons donc utiliser Response.getOutputStream() pour obtenir le flux de l'objet de réponse. Nous pouvons utiliser le flux de sortie pour créer un objet JPEGImageEncoder et appeler son encode() , en passant l'objet BufferedImage que nous avons créé précédemment :
Encodeur JPEGImageEncoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(bi);
L'image résultante est relativement petite, occupant seulement 13,7 kilo-octets de capacité. La figure B donne l'effet final :
Figure B
Dans les deux cas, la sortie de index.jsp est une image JPEG. Vous pouvez l'enregistrer sur votre bureau ou appuyer sur la touche PrintScreen pour prendre une capture d'écran. Si vous devez afficher plusieurs graphiques sur la même page ou introduire des graphiques dans un autre contenu, vous pouvez utiliser la balise HTML img (< img src = ”index.jsp"> ), puis placer les graphiques si nécessaire, par exemple Utiliser un formulaire.
L'une des technologies Internet les plus anciennes pour les graphiques générés dynamiquement peut peut-être effectuer des tâches autres que l'affichage d'une image. Imaginez que vous deviez enregistrer le nombre de spectateurs de cette image (de la même manière que vous enregistriez le nombre de clics sur une publicité), puis vous deviez implémenter des tâches telles que le comptage des clics, l'accès à la base de données ou aux fichiers dans index.jsp , et vous pouvez traiter ces tâches en arrière-plan. Il n'est pas nécessaire d'utiliser le changement de page tamponné pour l'utilisateur.
Dans cet article, nous avons examiné une méthode qui produit des histogrammes soignés et agréables. Nous avons habilement géré la modification de la taille des graphiques et leur encodage au format JPEG, et discuté de la modification du code HTML pour placer les images résultantes à différents endroits de la page.