Do you need to include cool charts in your Web application and you want to do it really quickly? Have a look at Primefaces which features a large set of to chart components to render your data.
Set up your Primefaces project
Firstly, to kickstart your Primefaces application include the following dependencies in your project’s pom.xml:
<dependencies> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>10.0.0</version> </dependency> </dependencies>
With that in place, we are ready to add your first Primefaces Chart.
Create a Primefaces Line Chart
Our first example includes a Line Chart. The Client side API to display a Line Chart is pretty simple:
<p:lineChart model="#{lineChart.lineModel}" style="width: 50%; height: 50%;"/>
The element lineChart maps a Managed Bean which contains the graph data in the LineChart Bean and the lineModel field. Here is the LineChart Bean:
package com.mastertheboss.model; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.inject.Model; import org.primefaces.model.charts.*; import org.primefaces.model.charts.line.*; import org.primefaces.model.charts.optionconfig.title.Title; @Model public class LineChart { private LineChartModel lineModel; @PostConstruct public void init() { lineModel = new LineChartModel(); ChartData data = new ChartData(); LineChartDataSet dataSet = new LineChartDataSet(); List values = new ArrayList<>(); values.add(15); values.add(2); values.add(10); values.add(25); values.add(19); values.add(23); dataSet.setData(values); dataSet.setFill(false); dataSet.setLabel("Acme Gross Incomes"); dataSet.setBorderColor("rgb(75, 192, 192)"); dataSet.setLineTension(0.1); data.addChartDataSet(dataSet); List<String> labels = new ArrayList<>(); labels.add("January"); labels.add("February"); labels.add("March"); labels.add("April"); labels.add("May"); labels.add("June"); data.setLabels(labels); //Options LineChartOptions options = new LineChartOptions(); Title title = new Title(); title.setDisplay(true); title.setText("Line Chart"); options.setTitle(title); lineModel.setOptions(options); lineModel.setData(data); } public LineChartModel getLineModel() { return lineModel; } }
Deploy your application on the application server. In our case, we will target the application on WildFly application server using its Maven plugin:
$ mvn install wildfly:deploy
Here is your Primefaces graph in action:
Create a Primefaces Bar Chart
Our second example uses a Bar Chart to provide a way of showing data values represented as vertical bar. The Client API does not differ too much from the LineChart component:
<p:barChart model="#{barChart.barModel}" style="width: 50%; height: 50%;"/>
The Model is contained in the BarChart Bean which follows here:
package com.mastertheboss.model; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.enterprise.inject.Model; import org.primefaces.model.charts.*; import org.primefaces.model.charts.axes.cartesian.CartesianScales; import org.primefaces.model.charts.axes.cartesian.linear.CartesianLinearAxes; import org.primefaces.model.charts.axes.cartesian.linear.CartesianLinearTicks; import org.primefaces.model.charts.bar.*; import org.primefaces.model.charts.optionconfig.legend.Legend; import org.primefaces.model.charts.optionconfig.legend.LegendLabel; import org.primefaces.model.charts.optionconfig.title.Title; @Model public class BarChart { private BarChartModel barModel; @PostConstruct public void init() { barModel = new BarChartModel(); ChartData data = new ChartData(); BarChartDataSet barDataSet = new BarChartDataSet(); barDataSet.setLabel("Acme Gross Incomes"); List<Number> values = new ArrayList<>(); values.add(65); values.add(59); values.add(80); values.add(81); values.add(56); values.add(55); values.add(40); barDataSet.setData(values); List<String> labels = new ArrayList<>(); labels.add("January"); labels.add("February"); labels.add("March"); labels.add("April"); labels.add("May"); labels.add("June"); labels.add("July"); data.setLabels(labels); //Data barModel.setData(data); //Options BarChartOptions options = new BarChartOptions(); CartesianScales cScales = new CartesianScales(); CartesianLinearAxes linearAxes = new CartesianLinearAxes(); CartesianLinearTicks ticks = new CartesianLinearTicks(); ticks.setBeginAtZero(true); linearAxes.setTicks(ticks); cScales.addYAxesData(linearAxes); options.setScales(cScales); Title title = new Title(); title.setDisplay(true); title.setText("Bar Chart"); options.setTitle(title); Legend legend = new Legend(); legend.setDisplay(true); legend.setPosition("top"); LegendLabel legendLabels = new LegendLabel(); legendLabels.setFontStyle("bold"); legendLabels.setFontColor("#2980B9"); legendLabels.setFontSize(24); legend.setLabels(legendLabels); options.setLegend(legend); barModel.setOptions(options); } public BarChartModel getBarModel() { return barModel; } }
If you want to have different colors for your single bars, you can add to your ChartData instance the RGB colors for each entry:
List<String> bgColor = new ArrayList<>(); bgColor.add("rgba(255, 99, 132, 0.2)"); bgColor.add("rgba(255, 159, 64, 0.2)"); bgColor.add("rgba(255, 205, 86, 0.2)"); bgColor.add("rgba(75, 192, 192, 0.2)"); bgColor.add("rgba(54, 162, 235, 0.2)"); bgColor.add("rgba(153, 102, 255, 0.2)"); bgColor.add("rgba(201, 203, 207, 0.2)"); barDataSet.setBackgroundColor(bgColor); List<String> borderColor = new ArrayList<>(); borderColor.add("rgb(255, 99, 132)"); borderColor.add("rgb(255, 159, 64)"); borderColor.add("rgb(255, 205, 86)"); borderColor.add("rgb(75, 192, 192)"); borderColor.add("rgb(54, 162, 235)"); borderColor.add("rgb(153, 102, 255)"); borderColor.add("rgb(201, 203, 207)"); barDataSet.setBorderColor(borderColor); barDataSet.setBorderWidth(1); data.addChartDataSet(barDataSet);
Deploy your application again and check the result:
Using an Horizontal Bar Chart
If you want to switch to an Horizontal Chart for your bars, all you need is to replace the BarChartModel with an HorizontalBarChartModel and a BarChartDataSet with an HorizontalBarChartDataSet:
private HorizontalBarChartModel hbarModel; @PostConstruct public void init() { hbarModel = new HorizontalBarChartModel(); ChartData data = new ChartData(); HorizontalBarChartDataSet hbarDataSet = new HorizontalBarChartDataSet();
Other Primefaces Graphs
As you can see from Primefaces show case, there are several other charts available out of the box. We will mention a few options taken from the showcase:
Pie Chart
Include in your HTML page:
<p:pieChart model="#{chartJsView.pieModel}" style="width: 100%; height: 500px;"/>
In your Bean:
private void createPieModel() { pieModel = new PieChartModel(); ChartData data = new ChartData(); PieChartDataSet dataSet = new PieChartDataSet(); List<Number> values = new ArrayList<>(); values.add(300); values.add(50); values.add(100); dataSet.setData(values); List<String> bgColors = new ArrayList<>(); bgColors.add("rgb(255, 99, 132)"); bgColors.add("rgb(54, 162, 235)"); bgColors.add("rgb(255, 205, 86)"); dataSet.setBackgroundColor(bgColors); data.addChartDataSet(dataSet); List<String> labels = new ArrayList<>(); labels.add("Red"); labels.add("Blue"); labels.add("Yellow"); data.setLabels(labels); pieModel.setData(data); }
Bubble Chart
In your HTML page:
<p:bubbleChart model="#{chartJsView.bubbleModel}" style="width: 100%; height: 500px;"/>
In your Managed Bean:
public void createBubbleModel() { bubbleModel = new BubbleChartModel(); ChartData data = new ChartData(); BubbleChartDataSet dataSet = new BubbleChartDataSet(); List<BubblePoint> values = new ArrayList<>(); values.add(new BubblePoint(20, 30, 15)); values.add(new BubblePoint(40, 10, 10)); dataSet.setData(values); dataSet.setBackgroundColor("rgb(255, 99, 132)"); dataSet.setLabel("First Dataset"); data.addChartDataSet(dataSet); bubbleModel.setData(data); }
Donut Chart
In your HTML Page:
<p:donutChart model="#{chartJsView.donutModel}" style="width: 100%; height: 500px;"/>
In your Managed Bean:
public void createDonutModel() { donutModel = new DonutChartModel(); ChartData data = new ChartData(); DonutChartDataSet dataSet = new DonutChartDataSet(); List<Number> values = new ArrayList<>(); values.add(300); values.add(50); values.add(100); dataSet.setData(values); List<String> bgColors = new ArrayList<>(); bgColors.add("rgb(255, 99, 132)"); bgColors.add("rgb(54, 162, 235)"); bgColors.add("rgb(255, 205, 86)"); dataSet.setBackgroundColor(bgColors); data.addChartDataSet(dataSet); List<String> labels = new ArrayList<>(); labels.add("Red"); labels.add("Blue"); labels.add("Yellow"); data.setLabels(labels); donutModel.setData(data); }
Conclusion
We have discussed how to create a different set of Primefaces chart to be used in a Web application. To test our application we have used as target server WildFly application server.
The source code for this tutorial is available here: https://github.com/fmarchioni/mastertheboss/tree/master/web/primefaces/chart