Tag Archives: java

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