Tag Archives: swing

JFreeChart dans vos applications Java

Bonjour, ce petit tutorial va tenter de vous expliquer comment faire de jolie diagramme dans une application JAVA/Swing.
Il est souvent agrĂ©able de montrer Ă  ses utilisateurs un diagramme, un camembert ou bien un histogramme, plutĂ´t qu’un gros tableau plein de chiffres. Il existe de nombreuses mĂ©thodes pour crĂ©er ce genre de graphique. Je vais vous prĂ©senter une mĂ©thode utilisant JFreeChart. JFreeChart est une bibliothèque java libre (malheuresement la documentation est payante). Elle est assez sexy et facile Ă  utiliser.

Installation

Comme toutes les bibliothèques java, il faut télécharger le .jar et le placer dans un dossier de votre projet. Pour le téléchargement aller à la page [Download] et choississez la version qui correspond à votre système.

DĂ©compressez le contenu de l’archive. Vous devriez obtenir une arborescence de fichier de la forme:

JFreeChart-*.*
    ant
    ChangeLog
    checkstyle
    docfiles
    experimental
    jfreechart-1.0.13-demo.jar
    lib
    licence-LGPL.txt
    maven-jfreechart-project.xml
    NEWS
    README.txt
    source
    swt
    tests

Ce qui est important, c’est le dossier lib. En effet, il contient les 3 archives jar nĂ©cessaire. Ă€ savoir: jfreechart-1.0.13.jar, jcommon-1.0.16.jar et iText-2.1.5.jar

Il faut en premier lier, ces jars avec votre projet java. La première Ă©tape est de copier les jars dans le rĂ©pertoire principal de votre projet. Ensuite, dans eclipse faite un click droit sur votre projet, choississez : Properties. SĂ©lectionnez Java Build Path puis l’onglet libraries

Appuyer sur Add External JARs… et sĂ©lectionnez les 3 jars de la JFreeChart que nous avons dĂ©placĂ©s. Appuyer sur Ok

Normalement une partie “Referenced Libraries” s’ajoute Ă  l’arborescence de votre projet. Ainsi eclipse inclura jfreechart Ă  la compilation de votre projet.

CrĂ©ation du panel d’affichage des diagrammes.

Ce n’est pas le sujet de ce tutorial donc je ne vais pas m’attarder dessus. Les charts sont tous contenu dans un JPanel. Il suffit donc de crĂ©er un JPanel avec un layout adĂ©quat pour mettre en place votre disposition. N’oubliez pas d’encapsuler votre panel dans un JScrollPane.

Premier Diagramme

JFreeChart permet de crĂ©er une multitude de diagramme, je ne traiterais que des PieCharts pour le moment. La première chose Ă  faire est de construire un ensemble de valeurs: Pour un PieChart (camenbert), utilisez [DefaultPieDataset], c’est une interface simple et pratique pour stocker des paires valeur/clĂ©. Pour un histogramme, utilisez plutĂ´t une implĂ©mentation de [CategoryDataset]

.

DefaultPieDataset union = new DefaultPieDataset();
//remplir l'ensemble
union.setValue("Pierre",20.0);
union.setValue("Marie",20.0);
union.setValue("Jean",20.0);
union.setValue("Hime",20.0);
union.setValue("Sarah",20.0);

Il est tout Ă  fait possible de faire une boucle for/while pour parcourrir un ensemble de donnĂ©es pour remplir celui du pieChart. Vous n’ĂŞtes pas tenu de remplir l’ensemble avant de crĂ©er le chart. Si vous ajoutez des valeurs dans l’ensemble après coup, le chart sera automatiquement mis Ă  jour.

Pour crĂ©er le diagramme lui mĂŞme, il suffit de faire appel Ă  l'”usine Ă  diagramme” [pattern factory].

JFreeChart repart = 
    ChartFactory.createPieChart3D("Répartition par personne",
    union, true, true, false);
ChartPanel crepart = new ChartPanel(repart);
add(crepart);

Le premier paramètre est, bien sĂ»r, le titre, suivit de l’ensemble de valeurs. Les valeurs boolĂ©ennes qui suivent sont respectivement : l’affichage de la lĂ©gende, l’affichage d’un tooltips et la crĂ©ation d’une URL). Une fois le JFreeChart créé, vous devez rĂ©cuperĂ©r l’encapsuler dans un ChartPanel et ajouter ce dernier dans votre Interface Homme Machine (IHM).

Aller plus loin

Personnaliser les couleurs de chaque valeur

Par dĂ©faut, JFreeChart utilise des couleurs alĂ©atoire pour coloriser les Ă©lĂ©ments. Il existe un moyen pour forcer l’utilisation d’une couleur. On reprends l’exemple du dessus et on le modifie un petit peu pour modifier les couleurs

JFreeChart repart= 
    ChartFactory.createPieChart3D("Répartition par personne",
    union, true, true, false);
ChartPanel crepart = new ChartPanel(repart);
plot = repart.getPlot();
((PiePlot)plot).setSectionPaint("Pierre", new Color(255,0,0));
((PiePlot)plot).setSectionPaint("Marie", new Color(255,255,0));
((PiePlot)plot).setSectionPaint("Jean", new Color(255,0,255));
((PiePlot)plot).setSectionPaint("Hime", new Color(0,0,255));
((PiePlot)plot).setSectionPaint("Sarah", new Color(0,255,255));
add(crepart);

Pour modifier les couleurs, il faut rĂ©cuperer une instance de Plot. Cela gère l’ensemble des règles de dessins. Dans chaque section, vous dĂ©finissez la couleur Ă  utiliser. Voici une capture d’Ă©cran du rĂ©sultat final. Capture d'Ă©cran JFreeChart

Je mettrais Ă  disposition le projet eclipse, d’ici quelques jours. En attendant, je donne le code source du panel principal:

import java.awt.Color;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.Plot;
import org.jfree.data.general.DefaultPieDataset;

public class Charts extends JPanel
{
    public Charts() 
    {
        super();
        DefaultPieDataset union = new DefaultPieDataset();
        union.setValue("Pierre",20.0);
        union.setValue("Marie",20.0);
        union.setValue("Jean",20.0);
        union.setValue("Hime",20.0);
        union.setValue("Sarah",20.0);
        JFreeChart repart = 
            ChartFactory.createPieChart3D("Répartition par personne",
            union,true, true, false);
        ChartPanel crepart = new ChartPanel(repart);
        Plot plot = repart.getPlot();
        ((PiePlot)plot).setSectionPaint("Pierre", new Color(255,0,0));
        ((PiePlot)plot).setSectionPaint("Marie", new Color(255,255,0));
        ((PiePlot)plot).setSectionPaint("Jean", new Color(255,0,255));
        ((PiePlot)plot).setSectionPaint("Hime", new Color(0,0,255));
        ((PiePlot)plot).setSectionPaint("Sarah", new Color(0,255,255));
        
        this.add(crepart);
    }
}

Plus d’Information