JFreeChar Label für StackedBar

Status
Nicht offen für weitere Antworten.

LukeVlbg

Aktives Mitglied
Bin gerade fieberhaft dran, herauszufinden wie man bei einem StackedBarChart ein Label hinbekommt. Komm aber einfach nicht drauf. Hab da ein Bespiel gesehen in dem über und in der StackedBar Werte vorkommen (siehe Anhang unten).

Ich habs bisher mit folgendem Code versucht (ohne Erfolg).
Code:
DecimalFormat decimalformat1 = new DecimalFormat("#,##0.#######");
		renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", decimalformat1));
		renderer.setItemLabelsVisible(true);

Weiss jemand wie man das so hinbekommt?
 

mmz

Aktives Mitglied
Also, um das so hinzubekommen wie auf deinem Screenshot brauchst Du den ExtendedStackedBarRenderer. In den Demos ist die Klasse ( *.class Datei ) zwar enthalten aber nicht in Form von Source Code. Den gibts ( glaub ich ) nur wenn man bezahlt. Vllt. hilft es ja mal nach JFreeChart und ExtendedStackedBarRenderer zu suchen.

Wenn Du nichts ala Source findest, such mal nach java decompiler ( *.jar ist kaum was anderes als *.zip ). Damit solltest Du weiter kommen. Was Du mit dem Ergebnis machst bleibt Dir überlassen.:bahnhof:

Hoffe das ist so ok....
 

LukeVlbg

Aktives Mitglied
Erstma danke für deine Antwort.
Hab nach ExtendedStackedBarRenderer gesucht, hab aber nicht wirklch viel brauchbares gefuden. Es verwenden tatsächlich einige Programme diese Klasse, aber niemand hat sie eingebunden.
Hab auch kein source-file gefunden, somit hilft mir der decompiler leider nichts.
 

LukeVlbg

Aktives Mitglied
Vielleicht noch als Anhang. Hab jetzt eine ExtendedStackedBarRenderer Klasse gefunden, allerdings sind dort einige Fehler enthalten. Z.B. in Zeile 110 oder 111 (das translateValueToJava2D kennt er nicht).

Java:
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics2D;
 import java.awt.Paint;
 import java.awt.geom.Rectangle2D;

 import org.jfree.chart.axis.CategoryAxis;
 import org.jfree.chart.axis.ValueAxis;
 import org.jfree.chart.entity.CategoryItemEntity;
 import org.jfree.chart.entity.EntityCollection;
 import org.jfree.chart.labels.CategoryItemLabelGenerator;
 import org.jfree.chart.plot.CategoryPlot;
 import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRendererState;
 import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.data.category.CategoryDataset;
 import org.jfree.ui.RectangleEdge;
 import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

 /**
  * An extension of the {@link StackedBarRenderer} that can draw positive and negative totals at
  * the top and bottom of the stacked bars.
  */
 public class ExtendedStackedBarRenderer extends StackedBarRenderer {

     /** Show positive label? */
     private boolean showPositiveTotal = true;
     
     /** Show negative label? */
     private boolean showNegativeTotal = true;
     
     /** Font for labels. */
     private final Font totalLabelFont = new Font("SansSerif", Font.PLAIN, 12);
     
     /**
      * Creates a new renderer.
      */
     public ExtendedStackedBarRenderer() {
         super();
     }
     
     // ****************************************************************************
 // * COMMERCIAL SUPPORT / JFREECHART DEVELOPER GUIDE *
 // * Please note that commercial support and documentation is available from: *
 // * *
 // * [url=http://www.object-refinery.com/jfreechart/support.html]Object Refinery Limited - JFreeChart[/url] *
 // * *
 // * This is not only a great service for developers, but is a VERY IMPORTANT *
 // * source of funding for the JFreeChart project. Please support us so that *
 // * we can continue developing free software. *
 // ****************************************************************************

     /**
      * Draws a stacked bar for a specific item.
      *
      * @param g2 the graphics device.
      * @param state the renderer state.
      * @param dataArea the plot area.
      * @param plot the plot.
      * @param domainAxis the domain (category) axis.
      * @param rangeAxis the range (value) axis.
      * @param dataset the data.
      * @param row the row index (zero-based).
      * @param column the column index (zero-based).
      */
     public void drawItem(Graphics2D g2,
                          CategoryItemRendererState state,
                          Rectangle2D dataArea,
                          CategoryPlot plot,
                          CategoryAxis domainAxis,
                          ValueAxis rangeAxis,
                          CategoryDataset dataset,
                          int row,
                          int column) {
      
         // nothing is drawn for null values...
    	 Number dataValue = dataset.getValue(row, column);
         if (dataValue == null) {
             return;
         }
         
         double value = dataValue.doubleValue();
         
         PlotOrientation orientation = plot.getOrientation();
         double barW0 = domainAxis.getCategoryMiddle(column, getColumnCount(), dataArea,
                                                     plot.getDomainAxisEdge())
                                                     - state.getBarWidth() / 2.0;

         double positiveBase = 0.0;
         double negativeBase = 0.0;

         for (int i = 0; i < row; i++) {
             Number v = dataset.getValue(i, column);
             if (v != null) {
                 double d = v.doubleValue();
                 if (d > 0) {
                     positiveBase = positiveBase + d;
                 }
                 else {
                     negativeBase = negativeBase + d;
                 }
             }
         }

         double translatedBase;
         double translatedValue;
         RectangleEdge location = plot.getRangeAxisEdge();
         if (value > 0.0) {
             translatedBase = rangeAxis.translateValueToJava2D(positiveBase, dataArea, location);
             translatedValue = rangeAxis.translateValueToJava2D(positiveBase + value, dataArea,
                                                                location);
         }
         else {
             translatedBase = rangeAxis.translateValueToJava2D(negativeBase, dataArea, location);
             translatedValue = rangeAxis.translateValueToJava2D(negativeBase + value, dataArea,
                                                                location);
         }
         double barL0 = Math.min(translatedBase, translatedValue);
         double barLength = Math.max(Math.abs(translatedValue - translatedBase),
                                     getMinimumBarLength());

         Rectangle2D bar = null;
         if (orientation == PlotOrientation.HORIZONTAL) {
             bar = new Rectangle2D.Double(barL0, barW0, barLength, state.getBarWidth());
         }
         else {
             bar = new Rectangle2D.Double(barW0, barL0, state.getBarWidth(), barLength);
         }
         Paint seriesPaint = getItemPaint(row, column);
         g2.setPaint(seriesPaint);
         g2.fill(bar);
         if (isDrawBarOutline() && state.getBarWidth() > BAR_OUTLINE_WIDTH_THRESHOLD) {
             g2.setStroke(getItemStroke(row, column));
             g2.setPaint(getItemOutlinePaint(row, column));
             g2.draw(bar);
         }

         CategoryItemLabelGenerator generator = getItemLabelGenerator(row, column);
         if (generator != null && isItemLabelVisible(row, column)) {
             drawItemLabel(g2, dataset, row, column, plot, generator, bar, (value < 0.0));
         }
        
         if (value > 0.0) {
             if (this.showPositiveTotal) {
                 if (isLastPositiveItem(dataset, row, column)) {
                     g2.setPaint(Color.black);
                     g2.setFont(this.totalLabelFont);
                     double total = calculateSumOfPositiveValuesForCategory(dataset, column);
                     RefineryUtilities.drawRotatedString(String.valueOf(total), g2,
                                                         (float) bar.getCenterX(),
                                                         (float) (bar.getMinY() - 4.0),
                                                         TextAnchor.BOTTOM_CENTER,
                                                         TextAnchor.BOTTOM_CENTER,
                                                         0.0);
                 }
             }
         }
         else {
             if (this.showNegativeTotal) {
                 if (isLastNegativeItem(dataset, row, column)) {
                     g2.setPaint(Color.black);
                     g2.setFont(this.totalLabelFont);
                     double total = calculateSumOfNegativeValuesForCategory(dataset, column);
                     RefineryUtilities.drawRotatedString(String.valueOf(total), g2,
                                                         (float) bar.getCenterX(),
                                                         (float) (bar.getMaxY() + 4.0),
                                                         TextAnchor.TOP_CENTER,
                                                         TextAnchor.TOP_CENTER,
                                                         0.0);
                 }
             }
         }
                 
      // collect entity and tool tip information...
 if (state.getInfo() != null) {
             EntityCollection entities = state.getInfo().getOwner().getEntityCollection();
             if (entities != null) {
                 String tip = null;
                 if (generator != null) {
                     tip = generator.generateToolTip(dataset, row, column);
                 }
                 String url = null;
                 if (getItemURLGenerator(row, column) != null) {
                     url = getItemURLGenerator(row, column).generateURL(dataset, row, column);
                 }
                 CategoryItemEntity entity = new CategoryItemEntity(
                     bar, tip, url, dataset, row, dataset.getColumnKey(column), column
                 );
                 entities.addEntity(entity);
             }
         }
         
     }

     /**
      * Returns true if the specified item is the last positive value for that category.
      *
      * @param dataset the dataset.
      * @param row the row (series).
      * @param column the column (category).
      *
      * @return a boolean.
      */
     private boolean isLastPositiveItem(CategoryDataset dataset, int row, int column) {
         boolean result = true;
         Number dataValue = dataset.getValue(row, column);
         if (dataValue == null) {
             return false; // value is null
 }
         for (int r = row + 1; r < dataset.getRowCount(); r++) {
             dataValue = dataset.getValue(r, column);
             if (dataValue != null) {
                 result = result && (dataValue.doubleValue() <= 0.0);
             }
         }
         return result;
     }

     /**
      * Returns true if the specified item is the last negative value for that category.
      *
      * @param dataset the dataset.
      * @param row the row (series).
      * @param column the column (category).
      *
      * @return a boolean.
     */
     private boolean isLastNegativeItem(CategoryDataset dataset, int row, int column) {
        boolean result = true;
         Number dataValue = dataset.getValue(row, column);
         if (dataValue == null) {
             return false; // value is null
 }
         for (int r = row + 1; r < dataset.getRowCount(); r++) {
             dataValue = dataset.getValue(r, column);
             if (dataValue != null) {
                 result = result && (dataValue.doubleValue() >= 0.0);
             }
         }
         return result;
     }
    /**
      * Calculates the sum of the positive values within a category.
      *
      * @param dataset the dataset.
      * @param column the column (category).
      *
      * @return the sum of the positive values.
      */
     private double calculateSumOfPositiveValuesForCategory(CategoryDataset dataset, int column) {
         double result = 0.0;
         for (int r = 0; r < dataset.getRowCount(); r++) {
             Number dataValue = dataset.getValue(r, column);
            if (dataValue != null) {
                 double v = dataValue.doubleValue();
                 if (v > 0.0) {
                     result = result + v;
                 }
             }
         }
         return result;
     }

     /**
      * Calculates the sum of the negative values within a category.
      *
      * @param dataset the dataset.
      * @param column the column (category).
      *
      * @return the sum of the negative values.
      */
     private double calculateSumOfNegativeValuesForCategory(CategoryDataset dataset, int column) {
         double result = 0.0;
         for (int r = 0; r < dataset.getRowCount(); r++) {
             Number dataValue = dataset.getValue(r, column);
             if (dataValue != null) {
                 double v = dataValue.doubleValue();
                 if (v < 0.0) {
                     result = result + v;
                 }
             }
         }
         return result;
     }
     
 }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
izoards Ausdruck auf Label Drucker AWT, Swing, JavaFX & SWT 1
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
I BoxLayout zentriert Label nicht AWT, Swing, JavaFX & SWT 7
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
R JavaFX Label oder Imageview anzeigen mit Buttonklick AWT, Swing, JavaFX & SWT 4
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
A Inhalt wechseln bei Klick auf Label AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
Trèfle JavaFX Formattierung im Label AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
F Countdown in Label anzeigen AWT, Swing, JavaFX & SWT 14
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
J Dateiname im Label einblenden AWT, Swing, JavaFX & SWT 4
C SWT autosize bei gc.drawString() auf einem Label AWT, Swing, JavaFX & SWT 7
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
T Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
zhermann NullPointerException bei Label.setText() AWT, Swing, JavaFX & SWT 5
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
L JavaFX ContextMenu bei Label mit Linksklick AWT, Swing, JavaFX & SWT 4
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
N Anordnung der Label AWT, Swing, JavaFX & SWT 3
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
R Swing JLabel berührung an einem anderen Label prüfen AWT, Swing, JavaFX & SWT 3
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
C Textfeld und Label werden nicht angezeigt (Ubuntu) AWT, Swing, JavaFX & SWT 2
C SWT Treeview mit Bilder im Label verändert Expanded Icon AWT, Swing, JavaFX & SWT 1
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
V Swing Brauche Hilfe mit Label AWT, Swing, JavaFX & SWT 3
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
B Swing JXMapKit Mausemove in Label anzeigen AWT, Swing, JavaFX & SWT 0
K Bild in Label wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
G Label wird nicht erstellt AWT, Swing, JavaFX & SWT 0
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
G Label erstellen AWT, Swing, JavaFX & SWT 6
U Label zeigt nicht überall HTML Zeichen AWT, Swing, JavaFX & SWT 3
F JavaFX label.getWidth() AWT, Swing, JavaFX & SWT 2
T Swing Label aus anderer Methode bearbeiten AWT, Swing, JavaFX & SWT 2
N Input/Output Stream werte in Label anzeigen. AWT, Swing, JavaFX & SWT 6
R JavaFX Label ändern in aufgerufener AnchorPane AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
G JavaFX CSS: Label in GridPane rechts ausrichten AWT, Swing, JavaFX & SWT 9
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
KrokoDiehl Swing Buchstaben im Label anders färben AWT, Swing, JavaFX & SWT 4
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
C Label wird nicht an der richtigen Position angezeigt.. AWT, Swing, JavaFX & SWT 7
H Label mit Icon positionieren AWT, Swing, JavaFX & SWT 14
E Netbeans: Buttons mit Label bzw. Rahmen unterlegen AWT, Swing, JavaFX & SWT 8
J resize - Label bleibt erst schwarz AWT, Swing, JavaFX & SWT 4
T label überschriebt seine werte-SWT AWT, Swing, JavaFX & SWT 3
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
D Label über JScrollPane AWT, Swing, JavaFX & SWT 3
N Label auf Hauptfenster manipulieren AWT, Swing, JavaFX & SWT 2
S VAADIN: Problem mit Label AWT, Swing, JavaFX & SWT 18
P Ausgabe Label AWT, Swing, JavaFX & SWT 6
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
S ImageIcon von Label entfernen AWT, Swing, JavaFX & SWT 9
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
A Bekomme das Label nicht in die Mitte von Reihe AWT, Swing, JavaFX & SWT 7
H SWT Markierbares Label AWT, Swing, JavaFX & SWT 8
A Swing Box Label ausrichten AWT, Swing, JavaFX & SWT 3
R Label in den Vordergrund einblenden AWT, Swing, JavaFX & SWT 5
J Hintergrund Label-Frame AWT, Swing, JavaFX & SWT 3
O Swing Label(bzw. Grafik) verdekt von anderm Label AWT, Swing, JavaFX & SWT 2
A TextField und Label AWT, Swing, JavaFX & SWT 8
L Label dynamisch awt AWT, Swing, JavaFX & SWT 2
J Label mit transparentem hintergrund - geht das? AWT, Swing, JavaFX & SWT 21
B Die Werte von getLocation() im Label anzeigen AWT, Swing, JavaFX & SWT 4
Avalarion SWT Listener auf Label oder Text Teile AWT, Swing, JavaFX & SWT 10
C Label Hintergrundbild mit Text AWT, Swing, JavaFX & SWT 6
A SWT - Farbe von Text auf Label ändern AWT, Swing, JavaFX & SWT 2
M gridbaglayout - abstand bei label und field AWT, Swing, JavaFX & SWT 8
hdi SWT Label Text vertikal zentrieren AWT, Swing, JavaFX & SWT 6
T In einem Label scrollen AWT, Swing, JavaFX & SWT 3
Spot84 swt label zeilenumbruch will nicht funktionieren AWT, Swing, JavaFX & SWT 1
lumo SWT Label - onResize? AWT, Swing, JavaFX & SWT 5
DasDogma AWT Problem bei Wertzuweisung für Label AWT, Swing, JavaFX & SWT 3
A Label hat falsche Position AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben