1 23 24 package de.progra.charting.render; 25 26 import java.awt.Color ; 27 import java.awt.Font ; 28 import java.awt.Graphics2D ; 29 import java.awt.geom.AffineTransform ; 30 import java.awt.geom.Point2D ; 31 import java.awt.geom.Rectangle2D ; 32 import java.awt.font.LineMetrics ; 33 import java.awt.font.FontRenderContext ; 34 import java.text.DecimalFormat ; 35 import de.progra.charting.PointToPixelTranslator; 36 import de.progra.charting.CoordSystem; 37 import de.progra.charting.model.AbstractChartDataModel; 38 import de.progra.charting.model.ChartDataModel; 39 import de.progra.charting.model.ChartDataModelConstraints; 40 import de.progra.charting.model.StackedChartDataModelConstraints; 41 42 49 public class StackedBarChartRenderer extends AbstractChartRenderer { 50 51 protected float boxWidth = 1.0f; 52 53 57 public StackedBarChartRenderer(CoordSystem cs, AbstractChartDataModel model) { 58 super(cs, model); 59 } 60 61 68 public StackedBarChartRenderer(CoordSystem cs, AbstractChartDataModel model, 69 float boxWidth) { 70 this(cs, model); 71 this.boxWidth = boxWidth; 72 } 73 74 75 78 public void renderChart(Graphics2D g) { 79 ChartDataModel m = getChartDataModel(); 80 ChartDataModelConstraints con = m.getChartDataModelConstraints(CoordSystem.FIRST_YAXIS); 81 82 System.out.println("** Maximum: "+con.getMaximumValue()+" Minimum: "+con.getMinimumValue()); 83 84 if(m.isColumnNumeric()) 85 return; 86 87 RowColorModel rcm = getRowColorModel(); 88 AffineTransform yaxis1 = getTransform(CoordSystem.FIRST_YAXIS); 89 90 int datasetcount = m.getDataSetNumber(); 91 92 int maximumDataSetLength = Integer.MIN_VALUE; 93 94 for(int i = 0; i < model.getDataSetNumber(); i++) { 95 maximumDataSetLength = Math.max(maximumDataSetLength, model.getDataSetLength(i)); 96 } 97 98 Point2D pointzero; 99 if(con.getMinimumValue().floatValue() > 0) 100 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 101 con.getMinimumValue().floatValue()), 102 null); 103 else if(con.getMaximumValue().floatValue() < 0) 104 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 105 con.getMaximumValue().floatValue()), 106 null); 107 else 108 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 109 0f), 110 null); 111 112 Point2D point1 = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 113 con.getMaximumValue().floatValue()), 114 null); 115 Point2D point2 = yaxis1.transform(new Point2D.Float ((float)con.getMaximumColumnValue(), 116 con.getMaximumValue().floatValue()), 117 null); 118 Point2D value = point1; 119 120 int dataunitwidth = (int)((point2.getX() - point1.getX()) / con.getMaximumColumnValue()); 121 int boxwidth = (int)(dataunitwidth * boxWidth); 122 float margin = (float)(dataunitwidth * ((1.0 - boxWidth)/2f)); 123 124 132 double currentvalue = 0.0; 133 Rectangle2D box = null; 134 Point2D oldmaxvalue; 135 Point2D oldminvalue; 136 137 for(int j = 0; j < maximumDataSetLength; j++) { 138 double minvalue = 0.0; 139 double maxvalue = 0.0; 140 141 oldmaxvalue = pointzero; 142 oldminvalue = pointzero; 143 144 for(int i = 0; i < m.getDataSetNumber(); i++) { 145 146 if(j < m.getDataSetLength(i)) 147 currentvalue = m.getValueAt(i, j).doubleValue(); 148 else 149 currentvalue = 0.0; 150 151 if(currentvalue < 0.0) { 152 minvalue += currentvalue; 153 yaxis1.transform(new Point2D.Float ((float)j, (float)minvalue), 154 value); 155 156 box = 157 new Rectangle2D.Float ((float)(value.getX()), 158 (float)Math.min(value.getY(), oldminvalue.getY()), 159 (float)boxwidth, 160 (float)Math.abs(oldminvalue.getY() - value.getY())); 161 oldminvalue = (Point2D )value.clone(); 162 } 163 else { 164 maxvalue += currentvalue; 165 yaxis1.transform(new Point2D.Float ((float)j, (float)maxvalue), 166 value); 167 168 box = 169 new Rectangle2D.Float ((float)(value.getX()), 170 (float)Math.min(value.getY(), oldmaxvalue.getY()), 171 (float)boxwidth, 172 (float)Math.abs(oldmaxvalue.getY() - value.getY())); 173 174 oldmaxvalue = (Point2D )value.clone(); 175 } 176 177 g.setColor(rcm.getColor(i)); 178 g.fill(box); 179 g.setColor(Color.black); 180 g.draw(box); 181 } 182 } 183 } 185 } 186 187 | Popular Tags |