matthew.harrison Posted February 20, 2017 Share Posted February 20, 2017 Hi, I've hit a bit of an issue, and am hopeful someone can give me some pointers on formatting my charts correctly.What I'm doinf is producing a stacked bar chart, which is fine. However the problem I'm having is that the Legend (showing the Series data) should be in a defined order. In the SQL I can define the order, but this is for the Category, and then the Series, so for example if I get data that looks like this (I think - this is just made up data):CategorySeriesValue125213228337Then when the graph is shown the Category is sorted fine, but the Legend (showing the Series), would look like [2, 1, 3] in this case I believe - i.e. in the order that they come in in the data.Is there a way to sort them in a customised way?I did try putting 'dummy' data into the data set, so that the first record would have the correct sort order for the Categories, which sort of worked, but this gets messy fast I think. So am I now looking at a customizer to get it sorted correctly? If so any pointers would be appreciated.Thanks in advance,Matt Link to comment Share on other sites More sharing options...
Solution matthew.harrison Posted February 26, 2017 Author Solution Share Posted February 26, 2017 I ended up finding an answer for this in the end. If its of any use to people in the future, I created a chart customizer, which allowed me to define a property to define the legend labels:import java.util.Iterator;import org.jfree.chart.JFreeChart;import org.jfree.chart.LegendItem;import org.jfree.chart.LegendItemCollection;import org.jfree.chart.plot.CategoryPlot;import net.sf.jasperreports.engine.JRAbstractChartCustomizer;import net.sf.jasperreports.engine.JRChart;import net.sf.jasperreports.engine.JRPropertiesMap;/** * Provides customisation of the chart display that are not possible with JasperReport properties. */public class ChartCustomiser extends JRAbstractChartCustomizer { @Override public void customize(final JFreeChart chart, final JRChart jasperChart) { final String[] legendLabels = findLegendLabelProperty(jasperChart); if (legendLabels.length > 0 && chart.getPlot() instanceof CategoryPlot) { reorderLegendLabels(legendLabels, chart); } } private void reorderLegendLabels(final String[] legendLabels, final JFreeChart chart) { final LegendItemCollection newLegendItemCollection = new LegendItemCollection(); for (final String label : legendLabels) { @SuppressWarnings("unchecked") final Iterator existingLegendItemIterator = chart.getLegend().getSources()[0].getLegendItems().iterator(); while (existingLegendItemIterator.hasNext()) { final LegendItem item = existingLegendItemIterator.next(); if (item.getDescription().equals(label)) { newLegendItemCollection.add(item); break; } } } if (newLegendItemCollection.getItemCount() > 0) { ((CategoryPlot) chart.getPlot()).setFixedLegendItems(newLegendItemCollection); } } private String[] findLegendLabelProperty(final JRChart jasperChart) { final JRPropertiesMap pm = jasperChart.getPropertiesMap(); final String legend = pm.getProperty("LegendLabels"); if (legend != null && !legend.isEmpty()) { return legend.split("\|"); } return new String[0]; }}[/code]This does mean if any items are missed from the LegendLabels property they don't get displayed, but it works for me.Hope this may be of use to someone if they hit the same issue, cheers,Matt Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now