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.ChartDataModel; 38 import de.progra.charting.model.ChartDataModelConstraints; 39 40 47 public class BarChartRenderer extends AbstractChartRenderer { 48 protected DecimalFormat barTopFormat; 49 protected float boxWidth = 1.0f; 50 protected Font barTopFont; 51 52 56 public BarChartRenderer(CoordSystem cs, ChartDataModel model) { 57 super(cs, model); 58 } 59 60 69 public BarChartRenderer(CoordSystem cs, ChartDataModel model, 70 DecimalFormat topFormat, Font topFont, float boxWidth) { 71 super(cs, model); 72 barTopFormat = topFormat; 73 this.barTopFont = topFont; 74 this.boxWidth = boxWidth; 75 } 76 77 78 81 public void renderChart(Graphics2D g) { 82 ChartDataModel m = getChartDataModel(); 83 ChartDataModelConstraints con = m.getChartDataModelConstraints(CoordSystem.FIRST_YAXIS); 84 85 if(m.isColumnNumeric()) 86 return; 87 88 RowColorModel rcm = getRowColorModel(); 89 AffineTransform yaxis1 = getTransform(CoordSystem.FIRST_YAXIS); 90 AffineTransform yaxis2 = getTransform(CoordSystem.SECOND_YAXIS); 91 92 int datasetcount = m.getDataSetNumber(); 93 94 Point2D point1 = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 95 con.getMaximumValue().floatValue()), 96 null); 97 Point2D point2 = yaxis1.transform(new Point2D.Float ((float)con.getMaximumColumnValue(), 98 con.getMaximumValue().floatValue()), 99 null); 100 Point2D value = point1; 101 102 int dataunitwidth = (int)((point2.getX() - point1.getX()) / con.getMaximumColumnValue()); 103 int boxwidth = (int)(dataunitwidth * boxWidth / datasetcount); 104 float margin = (float)(dataunitwidth * ((1.0 - boxWidth)/2f)); 105 106 Point2D pointzero; 107 if(con.getMinimumValue().floatValue() > 0) 108 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 109 con.getMinimumValue().floatValue()), 110 null); 111 else if(con.getMaximumValue().floatValue() < 0) 112 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 113 con.getMaximumValue().floatValue()), 114 null); 115 else 116 pointzero = yaxis1.transform(new Point2D.Float ((float)con.getMinimumColumnValue(), 117 0f), 118 null); 119 120 FontRenderContext columnTopfrc = null; 121 LineMetrics lm = null; 122 DecimalFormat df = null; 123 Rectangle2D fontRec = null; 124 String columnTop = null; 125 if (barTopFormat != null) { 126 g.setFont(barTopFont); 127 columnTopfrc = new FontRenderContext (null, false, false); 128 } 129 137 for(int i = 0; i < datasetcount; i++) { 138 140 for(int j = 0; j < m.getDataSetLength(i); j++) { 141 yaxis1.transform(new Point2D.Float ((float)j, m.getValueAt(i, j).floatValue()), 142 value); 143 144 Rectangle2D box = 145 new Rectangle2D.Float ((float)(value.getX() + margin + i*boxwidth), 146 (float)Math.min(value.getY(), pointzero.getY()), 147 (float)boxwidth, 148 (float)Math.abs(pointzero.getY() - value.getY())); 149 150 g.setColor(rcm.getColor(i)); 151 g.fill(box); 152 g.setColor(Color.black); 153 g.draw(box); 154 155 if (barTopFormat != null) { 156 columnTop = barTopFormat.format(model.getValueAt(i,j).doubleValue()); 158 fontRec = barTopFont.getStringBounds(columnTop, columnTopfrc); 159 lm = barTopFont.getLineMetrics(columnTop, columnTopfrc); 160 g.drawString(columnTop, 161 (float)(value.getX() + i*boxwidth + 162 (boxwidth - fontRec.getWidth())/2) - lm.getLeading(), 163 (float)(Math.min(value.getY(), pointzero.getY())-lm.getDescent())); 164 } 165 } 166 } 167 } 169 } 170 | Popular Tags |