2016-06-08 11 views
1

Ich habe ein JFreeChart, das ich durch einen Customizer (JRAbstractChartCustomizer) laufen lasse. Ich habe herausgefunden, wie man einzelne Balken und Artikelbeschriftungen entsprechend den Daten einfärbt (zB grün für> 90%, gelb für 75-90%, rot für < 75%), indem man BarRenderer erweitert und getItemLabelPaint(int row, int column) und getItemPaint(int row, int column) überschreibt. Jeder Balken hat ein entsprechendes Häkchen mit einem String-Label, da die Domain nach Namen und nicht nach Zahlenwerten benannt ist. Ich brauche eine Möglichkeit, die Hilfsstrichsbeschriftungen individuell zu färben, basierend auf dem Wert, der dem ähnlich ist, wie ich die Balken und die Elementbeschriftungen einfärbe.Anpassen der Farbe für einzelne Domänen-Achsen-Tick-Labels

Welche Methode überschreibe ich in BarRenderer, oder was sonst mache ich in meinem JRChartCustomizer, um die Farbe auf einer individuellen Basis zu überschreiben.

Was für den Artikel Etiketten ich tue: (ich im Grunde die gleiche Sache, aber für tick-Etiketten tun wollen)

class CustomBarRenderer extends BarRenderer { 

    private final Color COLOR_GREEN = new Color(0, 227, 0); 
    private final Color COLOR_YELLOW = new Color(247, 210, 0); 
    private final Color COLOR_RED = new Color(237, 26, 0); 

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

     if (cDataset != null) { 
      Number itemValue = cDataset.getValue(row, col); 

      String rowKey = cDataset.getRowKey(row).toString(); 
      String colKey = cDataset.getColumnKey(col).toString(); 

      if (itemValue != null) { 
       int intVal = itemValue.intValue(); 

       if (intVal > yellowHigh) { 
        return COLOR_GREEN; 
       } else if (intVal >= yellowLow) { 
        return COLOR_YELLOW; 
       } else { 
        return COLOR_RED; 
       } 
      } 
     } 

     // if all else fails... 
     return super.getItemLabelPaint(row, col); 
    } 

    @Override 
    public Paint getItemPaint(int row, int col) { 
     ... similar to above ... 
    } 
} 

Antwort

1

Ihre Chart Domain Achse tick Etikett wiedergegeben wird von einem CategoryAxis. Sie können setTickLabelPaint() verwenden, um Etiketten nach Kategorie zu färben. Im folgenden Beispiel wird BarChartDemo1 geändert, damit das Kategorieetikett "Test" eine grüne Farbe erhält.

image

CategoryPlot plot = (CategoryPlot) chart.getPlot(); 
CategoryAxis domain = plot.getDomainAxis(); 
domain.setTickLabelPaint("Test", Color.green.darker()); 

Für eine feinere Steuerung können Sie getTickLabelPaint() in einem benutzerdefinierten CategoryAxis außer Kraft setzen, die Zugriff auf den Datensatz, indem Sie Ihre CustomBarRenderer verwiesen hat. Die vorhandene implementation verwendet eine Map<Category, Paint> als Nachschlagetabelle. Die Map ist privat, aber der Ansatz kann Ihnen eine Vorstellung davon geben, wie Sie vorgehen sollen.

+0

Das hilft sehr! Ich nehme nicht an, dass der Kategoriename Regex oder einen Platzhalter verwenden kann? Das wäre einfach zu einfach. –

+0

Sorry, nicht das ich weiß. Sie können möglicherweise eine geeignete 'Funktion', dargestellt [hier] (http://stackoverflow.com/a/37222598/230513), weitergeben, um die gleiche Berechnung an beiden Stellen sicherzustellen. – trashgod

+0

Keine Sorgen. Deine Antwort hat mein Problem sehr gut gelöst. –

Verwandte Themen