📄 stackedxyarearenderer.java
字号:
* @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 tableXYDataset = (TableXYDataset) dataset; int itemCount = tableXYDataset.getItemCount(); // get the data point... Number x1 = dataset.getXValue(series, item); Number y1 = dataset.getYValue(series, item); boolean nullPoint = false; if (y1 == null) { y1 = new Double(0); nullPoint = true; } // Get height adjustment based on stack and translate to Java2D values double ph1 = this.getPreviousHeight(dataset, series, item); double transX1 = domainAxis.valueToJava2D( x1.doubleValue(), dataArea, plot.getDomainAxisEdge() ); double transY1 = rangeAxis.valueToJava2D( y1.doubleValue() + 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 (this.getPlotLines()) { if (item > 0) { // get the previous data point... Number x0 = dataset.getXValue(series, item - 1); Number y0 = dataset.getYValue(series, item - 1); double ph0 = this.getPreviousHeight(dataset, series, item - 1); double transX0 = domainAxis.valueToJava2D( x0.doubleValue(), dataArea, plot.getDomainAxisEdge() ); double transY0 = rangeAxis.valueToJava2D( y0.doubleValue() + 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 (this.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 (this.isOutline()) { g2.setStroke(plot.getOutlineStroke()); g2.setPaint(plot.getOutlinePaint()); g2.draw(areaState.getSeriesArea()); } } updateCrosshairValues( crosshairState, x1.doubleValue(), y1.doubleValue(), transX1, transY1, orientation ); } else if (pass == 1) { // On second pass render shapes and collect entity and tooltip information Shape shape = null; if (this.getPlotShapes()) { shape = getItemShape(series, item); if (plot.getOrientation() == PlotOrientation.VERTICAL) { shape = createTransformedShape(shape, transX1, transY1); } else if (plot.getOrientation() == PlotOrientation.HORIZONTAL) { shape = createTransformedShape(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.addEntity(entity); } } } } /** * Calculates the stacked value of the all series up to, but not including <code>series</code> * for the specified category, <code>category</code>. It returns 0.0 if <code>series</code> * is the first series, i.e. 0. * * @param data the data. * @param series the series. * @param index the index. * * @return double returns a cumulative value for all series' values up to * but excluding <code>series</code> for <code>index</code>. */ protected double getPreviousHeight(XYDataset data, int series, int index) { double result = 0.0; Number tmp; for (int i = 0; i < series; i++) { tmp = data.getYValue(i, index); if (tmp != null) { result += tmp.doubleValue(); } } return result; } /** * 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(); } /** * Returns the Paint used for rendering shapes, or null if using series Paints * * @return The Paint. */ public Paint getShapePaint() { return this.shapePaint; } /** * Returns the Stroke used for rendering shapes, or null if using series Strokes. * * @return The Stroke. */ public Stroke getShapeStroke() { return this.shapeStroke; } /** * Sets the Paint for rendering shapes. * * @param shapePaint The Paint. */ public void setShapePaint(Paint shapePaint) { this.shapePaint = shapePaint; } /** * Sets the Stroke for rendering shapes. * * @param shapeStroke The Stroke. */ public void setShapeStroke(Stroke shapeStroke) { this.shapeStroke = shapeStroke; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -