Creare grafici in Java con JFreeChart

Mattepuffo's logo
Creare grafici in Java con JFreeChart

Creare grafici in Java con JFreeChart

JFreeChart è una libreria per Java per creare grafici.

I dati per riempire i grafici possiamo crearli staticamente o prenderli da altre fonti, tipo da database MySQL.

E questo è proprio l'esempio che vedremo.

Inoltre possiamo sia creare un'immagine sul disco che aggiungerlo a un pannello.

Nello specifico vedremo questo esempio.

Prima di tutto scarichiamo la libreria da qua; tenete conto che JFreeChart richiede anche JCommon che comunque potete scaricare sempre dalla stessa pagina.

Poi aggiungete le librerie al vostro progetto.

A questo punto creaimo una classe apposita:

import java.io.IOException;
import java.sql.SQLException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;


import org.jfree.data.jdbc.JDBCCategoryDataset;

public class CreateGraph {

    private DBManager conn = DBManager.getInstance();

    public ChartPanel create() throws ClassNotFoundException, SQLException, IOException {
        JDBCCategoryDataset dataset = new JDBCCategoryDataset(conn.takeConnection());
        dataset.executeQuery("SELECT author_name AS AUTHORS, COUNT(*) AS CONT FROM bookv GROUP BY AUTHORS ORDER BY CONT");
        JFreeChart chart = ChartFactory.createBarChart3D("BOOK", "AUTHOR", "NUMBER OF BOOK", dataset, PlotOrientation.HORIZONTAL, true, true, true);
        ChartPanel cp = new ChartPanel(chart);
        return cp;
    }
}

Come detto creeremo il grafico da MySQL; questo richiede che ci sia una connessione.

Infatti l'oggetto JDBCCategoryDataset richiede un oggetto Connection.

Io per la connessione uso Singleton e una classe apposita:

import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;

public class DBManager {

    private static DBManager instance = null;
    final static String HOST = "localhost";
    final static String DB = "db";
    final static String USER = "user";
    final static String PWD = "pwd";
    private static Connection conn = null;

    private DBManager() {
    }

    public static DBManager getInstance() {
        return (instance == null) ? (instance = new DBManager()) : instance;
    }

    public Connection takeConnection() throws ClassNotFoundException, SQLException, IOException {
        Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://" + HOST + ":3306/" + DB + "?user=" + USER + "&password=" + PWD);
        return conn;
    }

}

Per ulteriori info: Singleton e connessione a MySQL.

A questo punto vediamo cosa succede dopo l'oggetto JDBCCategoryDataset.

Eseguiamo una query contando e raggruppando gli autori; il db che stiamo interrogando è quello della mia libreria; quello che voglio fare è contare gli autori, raggrupparli e rappresentarli graficamente.

Subito sotto creo un oggetto JFreeChart ed un grafico a barre 3D.

Volendo possiamo creare grafici di altri tipi; qui abbiamo vari esempi.

Dopo di che creo un ChartPanel che lo stesso oggetto restituito dal metodo.

Questo perchè poi lo rappresenteremo dentro un JPanel, sennò avremo potuto usare questa riga per salvarlo sul disco in formato PNG:

ChartUtilities.saveChartAsPNG(new java.io.File("chart.png"), chart, 1000, 1000);

Questa la finestra dove rappresentare il tutto:

    private void formWindowOpened(java.awt.event.WindowEvent evt) {
        try {
            CreateGraph cg = new CreateGraph();
            JPanel pgraph = cg.create();
            this.add(pgraph, java.awt.BorderLayout.CENTER);
            this.repaint();
            this.validate();
        } catch (ClassNotFoundException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        } catch (IOException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

In pratica ho impostato un evento in apertura di finestra del JFrame e gli ho detto di aggiungere il panel creato dal metodo sopra.

A seconda della velocità di connessione vedremo caricare il grafico dentro alla finestra.

Enjoy!


Condividi

Commentami!