Membuat grafik dengan JFreeChart
Dengan JFreeChart, membuat grafik di java menjadi mudah. Kita tidak perlu lagi berurusan dengan low level Java 2D API. Ada banyak jenis chart yang disupport olleh JFreeChart, namun di contoh kali ini saya hanya akan membuat grafik sederhana (garis dan batang) dengan menggunakan static (dummy) data.
Ada dua library yang kita butuhkan yaitu jfreechart.jar dan jcommon.jar. Class utama dari JFreeChart adalah ChartFactory, yang merupakan factory class untuk membuat berbagai macam chart. Pseudo codenya:
1. Buat dataset dengan meng-create object DefaultCategoryDataset.
2. Tambahkan data dengan memanggil method addValue().
3. Definisikan title, label untuk sumbu X dan sumbu Y.
4. Create chart dengan memanggil method ChartFactory.createLineChart() yang akan menghasilkan object chart.
5. Buat object ChartPanel dengan memberikan object chart tadi sebagai argumen.
6. Tampilkan panel ini pada aplikasi swing anda.
Contoh sample lengkapnya:
package suhearie.blog.chart;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JButton;
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.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import java.awt.GridBagConstraints;
import javax.swing.JComboBox;
import javax.swing.JLabel;
public class TestChart extends JFrame {
private JPanel jContentPane = null;
private JButton btnChart = null;
private JPanel panelChart = null;
private JComboBox comboOption = null;
private JLabel jLabel = null;
/**
* This is the default constructor
*/
public TestChart() {
super();
initialize();
}
/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(744, 543);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.insets = new java.awt.Insets(5,5,5,5);
gridBagConstraints2.gridy = 0;
jLabel = new JLabel();
jLabel.setText("Tipe Chart");
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
gridBagConstraints11.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints11.gridy = 0;
gridBagConstraints11.weightx = 1.0;
gridBagConstraints11.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints11.insets = new java.awt.Insets(5,20,5,5);
gridBagConstraints11.gridx = 1;
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
gridBagConstraints1.gridx = 0;
gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints1.weightx = 1.0;
gridBagConstraints1.weighty = 1.0;
gridBagConstraints1.gridwidth = 3;
gridBagConstraints1.gridy = 1;
GridBagConstraints gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.insets = new java.awt.Insets(5,5,5,5);
gridBagConstraints.gridy = 0;
jContentPane = new JPanel();
jContentPane.setLayout(new GridBagLayout());
jContentPane.add(getBtnChart(), gridBagConstraints);
jContentPane.add(getPanelChart(), gridBagConstraints1);
jContentPane.add(getComboOption(), gridBagConstraints11);
jContentPane.add(jLabel, gridBagConstraints2);
}
return jContentPane;
}
/**
* This method initializes btnChart
*
* @return javax.swing.JButton
*/
private JButton getBtnChart() {
if (btnChart == null) {
btnChart = new JButton();
btnChart.setText("Show");
btnChart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
generateChart();
}
});
}
return btnChart;
}
private void generateChart() {
String title = "Average Salary (2004 - 2008)";
String categoryLabel = "Year";
String valueLAbel = "Salary (x1000 USD)";
CategoryDataset dataSet = populateDataSet();
String type = (String) getComboOption().getSelectedItem();
JFreeChart chart = null;
if (type.equals("LINE")) {
chart = ChartFactory.createLineChart(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
}
else if (type.equals("LINE 3D")) {
chart = ChartFactory.createLineChart3D(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
}
else if (type.equals("BAR")) {
chart = ChartFactory.createBarChart(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
}
else if (type.equals("BAR 3D")) {
chart = ChartFactory.createBarChart3D(title, categoryLabel, valueLAbel, dataSet, PlotOrientation.VERTICAL, true, true, true);
}
if (panelChart.getComponentCount()>0) {
panelChart.remove(0);
}
panelChart.add(new ChartPanel(chart));
getJContentPane().validate();
}
private CategoryDataset populateDataSet() {
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
int[] tahun = {2004,2005,2006,2007,2008};
int[] MS = {100,120,140,150,155};
int[] Oracle = {110,120,120,150,160};
int[] Google = {80,85,100,140,175};
for (int i=0; i<tahun.length; i++) {
String thn = String.valueOf(tahun[i]);
dataSet.addValue(MS[i], "MS", thn);
dataSet.addValue(Oracle[i], "Oracle", thn);
dataSet.addValue(Google[i], "Google", thn);
}
return dataSet;
}
/**
* This method initializes panelChart
*
* @return javax.swing.JPanel
*/
private JPanel getPanelChart() {
if (panelChart == null) {
panelChart = new JPanel();
}
return panelChart;
}
/**
* This method initializes comboOption
*
* @return javax.swing.JComboBox
*/
private JComboBox getComboOption() {
if (comboOption == null) {
comboOption = new JComboBox();
comboOption.addItem("LINE");
comboOption.addItem("LINE 3D");
comboOption.addItem("BAR");
comboOption.addItem("BAR 3D");
}
return comboOption;
}
public static void main(String[] args) {
new TestChart().setVisible(true);
}
} // @jve:decl-index=0:visual-constraint="10,10"
Hasilnya:
Chart tersebut bisa dikustomisasi sesuai dengan kebutuhan, diantaranya mengatur renderer dan tampilan. Selengkapnya bisa dibaca di sini.



Nice Post and nice blog…. Hmn… mungkin gue bakal sering kesini deh… btw,
Gue mo nanya nih, gue punya source untuk nampilin pie chart via jsp (pake JFreeChart juga). masalahnya gue butuh fitur agar setiap value dari chart bisa ngelink ke halaman lain dan nampilin detail dari chart tersebut…
kira-kira sourcenya gini:
<%
String[] section = new String[] {
“Notifikasi”,”Checklist”,”Paripurna”,”Draft Surat”,”Net Surat”,”BPMIGAS”
};
// data…
double[] data = new double[section.length];
for (int i = 0; i < data.length; i++) {
data[i] = 10 + (Math.random() * 10);
}
// create the dataset…
DefaultPieDataset dataset = new DefaultPieDataset();
for (int i = 0; i
JSP Page
kalo dari yang gue dapet di forum pake imagemap, cuma masalahnya gimana cara generate imagemap pake JFreeChart…
sebelumnya maaf kalo commentnya panjang banget
wah kayanya ga bisa posting code di comment ya? heheheh…. btw kalo ada solusi share ya?
thanks