stackedxyarearenderer.java
来自「JfreeChart 常用图表例子」· Java 代码 · 共 648 行 · 第 1/2 页
JAVA
648 行
(TableXYDataset) dataset ); } else { return null; } } /** * Draws the visual representation of a single data item. * * @param g2 the graphics device. * @param state the renderer state. * @param dataArea the area within which the data is being drawn. * @param info collects information about the drawing. * @param plot the plot (can be used to obtain standard color information * etc). * @param domainAxis the domain axis. * @param rangeAxis the range axis. * @param dataset the dataset. * @param series the series index (zero-based). * @param item the item index (zero-based). * @param crosshairState information about crosshairs on a plot. * @param pass the pass index. */ public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, int series, int item, CrosshairState crosshairState, int pass) { PlotOrientation orientation = plot.getOrientation(); StackedXYAreaRendererState areaState = (StackedXYAreaRendererState) state; // Get the item count for the series, so that we can know which is the // end of the series. TableXYDataset tdataset = (TableXYDataset) dataset; int itemCount = tdataset.getItemCount(); // get the data point... double x1 = dataset.getXValue(series, item); double y1 = dataset.getYValue(series, item); boolean nullPoint = false; if (Double.isNaN(y1)) { y1 = 0.0; nullPoint = true; } // Get height adjustment based on stack and translate to Java2D values double ph1 = getPreviousHeight(tdataset, series, item); double transX1 = domainAxis.valueToJava2D( x1, dataArea, plot.getDomainAxisEdge() ); double transY1 = rangeAxis.valueToJava2D( y1 + ph1, dataArea, plot.getRangeAxisEdge() ); // Get series Paint and Stroke Paint seriesPaint = getItemPaint(series, item); Stroke seriesStroke = getItemStroke(series, item); if (pass == 0) { // On first pass renderer the areas, line and outlines if (item == 0) { // Create a new Area for the series areaState.setSeriesArea(new Polygon()); areaState.setLastSeriesPoints( areaState.getCurrentSeriesPoints() ); areaState.setCurrentSeriesPoints(new Stack()); // start from previous height (ph1) double transY2 = rangeAxis.valueToJava2D( ph1, dataArea, plot.getRangeAxisEdge() ); // The first point is (x, 0) if (orientation == PlotOrientation.VERTICAL) { areaState.getSeriesArea().addPoint( (int) transX1, (int) transY2 ); } else if (orientation == PlotOrientation.HORIZONTAL) { areaState.getSeriesArea().addPoint( (int) transY2, (int) transX1 ); } } // Add each point to Area (x, y) if (orientation == PlotOrientation.VERTICAL) { Point point = new Point((int) transX1, (int) transY1); areaState.getSeriesArea().addPoint( (int) point.getX(), (int) point.getY() ); areaState.getCurrentSeriesPoints().push(point); } else if (orientation == PlotOrientation.HORIZONTAL) { areaState.getSeriesArea().addPoint( (int) transY1, (int) transX1 ); } if (getPlotLines()) { if (item > 0) { // get the previous data point... double x0 = dataset.getXValue(series, item - 1); double y0 = dataset.getYValue(series, item - 1); double ph0 = getPreviousHeight(tdataset, series, item - 1); double transX0 = domainAxis.valueToJava2D( x0, dataArea, plot.getDomainAxisEdge() ); double transY0 = rangeAxis.valueToJava2D( y0 + ph0, dataArea, plot.getRangeAxisEdge() ); if (orientation == PlotOrientation.VERTICAL) { areaState.getLine().setLine( transX0, transY0, transX1, transY1 ); } else if (orientation == PlotOrientation.HORIZONTAL) { areaState.getLine().setLine( transY0, transX0, transY1, transX1 ); } g2.draw(areaState.getLine()); } } // Check if the item is the last item for the series and number of // items > 0. We can't draw an area for a single point. if (getPlotArea() && item > 0 && item == (itemCount - 1)) { double transY2 = rangeAxis.valueToJava2D( ph1, dataArea, plot.getRangeAxisEdge() ); if (orientation == PlotOrientation.VERTICAL) { // Add the last point (x,0) areaState.getSeriesArea().addPoint( (int) transX1, (int) transY2 ); } else if (orientation == PlotOrientation.HORIZONTAL) { // Add the last point (x,0) areaState.getSeriesArea().addPoint( (int) transY2, (int) transX1 ); } // Add points from last series to complete the base of the // polygon if (series != 0) { Stack points = areaState.getLastSeriesPoints(); while (!points.empty()) { Point point = (Point) points.pop(); areaState.getSeriesArea().addPoint( (int) point.getX(), (int) point.getY() ); } } // Fill the polygon g2.setPaint(seriesPaint); g2.setStroke(seriesStroke); g2.fill(areaState.getSeriesArea()); // Draw an outline around the Area. if (isOutline()) { g2.setStroke(getSeriesOutlineStroke(series)); g2.setPaint(getSeriesOutlinePaint(series)); g2.draw(areaState.getSeriesArea()); } } updateCrosshairValues( crosshairState, x1, y1, transX1, transY1, orientation ); } else if (pass == 1) { // On second pass render shapes and collect entity and tooltip // information Shape shape = null; if (getPlotShapes()) { shape = getItemShape(series, item); if (plot.getOrientation() == PlotOrientation.VERTICAL) { shape = ShapeUtilities.createTranslatedShape( shape, transX1, transY1 ); } else if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { shape = ShapeUtilities.createTranslatedShape( shape, transY1, transX1 ); } if (!nullPoint) { if (getShapePaint() != null) { g2.setPaint(getShapePaint()); } else { g2.setPaint(seriesPaint); } if (getShapeStroke() != null) { g2.setStroke(getShapeStroke()); } else { g2.setStroke(seriesStroke); } g2.draw(shape); } } else { if (plot.getOrientation() == PlotOrientation.VERTICAL) { shape = new Rectangle2D.Double( transX1 - 3, transY1 - 3, 6.0, 6.0 ); } else if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { shape = new Rectangle2D.Double( transY1 - 3, transX1 - 3, 6.0, 6.0 ); } } // collect entity and tool tip information... if (state.getInfo() != null) { EntityCollection entities = state.getInfo().getOwner().getEntityCollection(); if (entities != null && shape != null && !nullPoint) { String tip = null; XYToolTipGenerator generator = getToolTipGenerator(series, item); if (generator != null) { tip = generator.generateToolTip(dataset, series, item); } String url = null; if (getURLGenerator() != null) { url = getURLGenerator().generateURL( dataset, series, item ); } XYItemEntity entity = new XYItemEntity( shape, dataset, series, item, tip, url ); entities.add(entity); } } } } /** * Calculates the stacked value of the all series up to, but not including * <code>series</code> for the specified item. It returns 0.0 if * <code>series</code> is the first series, i.e. 0. * * @param dataset the dataset. * @param series the series. * @param index the index. * * @return The cumulative value for all series' values up to but excluding * <code>series</code> for <code>index</code>. */ protected double getPreviousHeight(TableXYDataset dataset, int series, int index) { double result = 0.0; for (int i = 0; i < series; i++) { double value = dataset.getYValue(i, index); if (!Double.isNaN(value)) { result += value; } } return result; } /** * Tests the renderer for equality with an arbitrary object. * * @param obj the object (<code>null</code> permitted). * * @return A boolean. */ public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof StackedXYAreaRenderer) || !super.equals(obj)) { return false; } StackedXYAreaRenderer that = (StackedXYAreaRenderer) obj; if (!ObjectUtilities.equal(this.shapePaint, that.shapePaint)) { return false; } if (!ObjectUtilities.equal(this.shapeStroke, that.shapeStroke)) { return false; } return true; } /** * Returns a clone of the renderer. * * @return A clone. * * @throws CloneNotSupportedException if the renderer cannot be cloned. */ public Object clone() throws CloneNotSupportedException { return super.clone(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?