2017-04-26 1 views
1

Ich hoffe, jemand kann mir helfen, ein benutzerdefiniertes Label für die Domain-Achse Tick Etiketten in einem jFreeChart von Jasper Reports erstellt wird. Ich habe alles versucht, was ich online gefunden habe und immer noch keine Würfel. Hier ist mein Code:jFreeChart benutzerdefinierte Domain-Achsenbeschriftungen

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics2D; 
import java.awt.Paint; 
import java.util.List; 

import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.CategoryAxis; 
import org.jfree.chart.axis.SymbolAxis; 
import org.jfree.chart.axis.ValueAxis; 
import org.jfree.chart.labels.CategoryItemLabelGenerator; 
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 
import org.jfree.chart.plot.CategoryPlot; 
import org.jfree.chart.renderer.category.BarRenderer; 
import org.jfree.data.Range; 
import org.jfree.data.category.CategoryDataset; 
import org.jfree.data.category.DefaultCategoryDataset; 
import org.jfree.text.TextBlock; 
import org.jfree.text.TextUtilities; 
import org.jfree.ui.RectangleEdge; 

import net.sf.jasperreports.engine.JRChart; 
import net.sf.jasperreports.engine.JRChartCustomizer; 

public class ChartCustomizer implements JRChartCustomizer{ 
    public class CustomColorRenderer extends BarRenderer { 
     private static final long serialVersionUID = -9045170581109026224L; 

     @Override 
     public Paint getItemPaint(int row, int col) { 
      CategoryDataset currentDataset = getPlot().getDataset(); 

      String columnKey = (String) currentDataset.getColumnKey(col); 
      String[] columnKeyValues = columnKey.split(":"); 

      if(columnKeyValues.length < 2) return getSeriesPaint(row); 

      String columnActualEstimated = columnKeyValues[2]; 
      if(columnActualEstimated.equals("A")) { 
       return Color.RED; 
      } else if(columnActualEstimated.equals("E")) { 
       return Color.BLUE; 
      }  

      return getSeriesPaint(row); 
     } 
    } 

    public void customize(JFreeChart chart, JRChart jasperChart) 
    { 
     if(jasperChart.getChartType() == JRChart.CHART_TYPE_BAR) { 
      CategoryPlot plot = chart.getCategoryPlot(); 
      CategoryDataset currentDataset = plot.getDataset(); 
      double maxValue = Double.MIN_VALUE; 

      // Scan to get total max value for the chart in order to set chart height appropriately 
      for(int i = 0; i < currentDataset.getRowCount(); i++) { 
       //System.out.println(i); 
       for(int j = 0; j < currentDataset.getColumnCount(); j++) { 
        Number numberValue = currentDataset.getValue(i, j); 

        //System.out.println("Column " + j + " key: " + currentDataset.getColumnKey(j)); 

        double value = numberValue == null ? Double.NaN : numberValue.doubleValue(); 
        if(value > maxValue) { 
         maxValue = value; 
        } 
       } 
      } 

      // Add 10% to top margin 
      double tenPercent = maxValue * 0.1; 
      maxValue = (Math.round((maxValue * 1.1)/tenPercent) * tenPercent) + tenPercent; 

      // Set max bar height to max value 
      ValueAxis yAxis = plot.getRangeAxis(); 
      yAxis.setAutoRange(false); 
      yAxis.setRange(0, maxValue); 

      CategoryAxis xAxis = plot.getDomainAxis(); 

      // Set label font size 
      xAxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 4)); 

      // Will set single bar colors by value with a custom renderer 
      CustomColorRenderer customRenderer = new CustomColorRenderer(); 

      // Set the chart to apply the custom renderer 
      plot.setRenderer(customRenderer); 
     } 
    } 
} 

Hier ist, was meine Grafik wie zur Zeit aussieht:

Chart example

Beachten Sie, dass die Domain-Achse Tasten wie "1: N: A" angezeigt wird. In diesem Fall bezieht sich 1 auf die Reihenfolge, N bezieht sich auf November, A bezieht sich auf den Wert "aktuell" gegenüber "geschätzt", die die beiden Serien sind. Alles was ich tun möchte, ist das sichtbare Häkchen auf "Nov" für das "1: N: A" Beispiel zu ändern. Dinge wie benutzerdefinierte Etikettengeneratoren ändern die Bezeichnungen für andere Teile des Diagramms und nicht die Hilfsstrichsbeschriftungen. Ich kann die Tick-Label-Fonts erfolgreich einstellen, aber ich kann nicht scheinen, dass die Labels selbst geändert werden.

Edit: Der andere schwierige Teil über diese Situation ist, dass die Anforderung 13 Monate anzeigen, bestehend aus den vorherigen 11, aktuelle und kommende. Der kommende Monat ist immer ein geschätzter Wert, daher die Serien "A" und "E". Dies macht es schmerzhaft, da dies bedeutet, dass es immer einen doppelten Monat gibt, also Spalten, die zusammengeführt werden sollen.

Jede Hilfe wäre willkommen. Lassen Sie mich wissen, wenn mehr Informationen benötigt werden.

Crossposted zu http://www.jfree.org/forum/viewtopic.php?f=3&t=117811

Antwort

1

Eine kundenspezifische CategoryItemLabelGenerator, die typischerweise die Stangen verwendet wird, beschriften ist wahrscheinlich nicht die richtige Wahl für diese. Wie in here gezeigt, erhält eine den Text der Kategorienbeschriftungen aus den Spaltenschlüsseln CategoryDataset über die getCategoriesForAxis()-Methode des Plots. Sie können beim Erstellen des Datasets die gewünschten Schlüssel angeben.

+0

Basierend auf Ihren Vorschlägen habe ich eine 'SymbolAxis' aus den vorhandenen Dataset Keys erstellt, die funktioniert, aber das Problem damit scheint keine Möglichkeit zu sein, die neue' SymbolAxis' auf die Domainachse seit dem Plot zu setzen 'setDomainAxis()' nimmt nur eine 'CategoryAxis', während' setRangeAxis() 'des Plots eine' SymbolAxis' als Eingabe benötigt. Fehle ich etwas? – Kettch19

+0

Hoppla, mein Fehler; 'SymbolAxis' ist nicht für die Domänenachse Ihres Kategorie-Plots geeignet – trashgod