xysteparearenderer.java

来自「JfreeChart 常用图表例子」· Java 代码 · 共 572 行 · 第 1/2 页

JAVA
572
字号
        return super.initialise(g2, dataArea, plot, data, info);    }    /**     * 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  crosshair information for the plot      *                        (<code>null</code> permitted).     * @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();                // Get the item count for the series, so that we can know which is the         // end of the series.        int itemCount = dataset.getItemCount(series);        Paint paint = getItemPaint(series, item);        Stroke seriesStroke = getItemStroke(series, item);        g2.setPaint(paint);        g2.setStroke(seriesStroke);        // get the data point...        Number x1 = dataset.getX(series, item);        Number y1 = dataset.getY(series, item);        double x = x1.doubleValue();        double y = y1 == null ? getRangeBase() : y1.doubleValue();        double transX1 = domainAxis.valueToJava2D(            x, dataArea, plot.getDomainAxisEdge()        );        double transY1 = rangeAxis.valueToJava2D(            y, dataArea, plot.getRangeAxisEdge()        );                                                                  // avoid possible sun.dc.pr.PRException: endPath: bad path        transY1 = restrictValueToDataArea(transY1, plot, dataArea);                 if (this.pArea == null && y1 != null) {            // Create a new Area for the series            this.pArea = new Polygon();                    // start from Y = rangeBase            double transY2 = rangeAxis.valueToJava2D(                getRangeBase(), dataArea, plot.getRangeAxisEdge()            );                    // avoid possible sun.dc.pr.PRException: endPath: bad path            transY2 = restrictValueToDataArea(transY2, plot, dataArea);                             // The first point is (x, this.baseYValue)            if (orientation == PlotOrientation.VERTICAL) {                this.pArea.addPoint((int) transX1, (int) transY2);            }            else if (orientation == PlotOrientation.HORIZONTAL) {                this.pArea.addPoint((int) transY2, (int) transX1);            }        }        double transX0 = 0;        double transY0 = restrictValueToDataArea(            getRangeBase(), plot, dataArea        );                           Number x0 = null;        Number y0 = null;        if (item > 0) {            // get the previous data point...            x0 = dataset.getX(series, item - 1);            y0 = y1 == null ? null : dataset.getY(series, item - 1);            x = x0.doubleValue();            y = y0 == null ? getRangeBase() : y0.doubleValue();            transX0 = domainAxis.valueToJava2D(                x, dataArea, plot.getDomainAxisEdge()            );            transY0 = rangeAxis.valueToJava2D(                y, dataArea, plot.getRangeAxisEdge()            );            // avoid possible sun.dc.pr.PRException: endPath: bad path            transY0 = restrictValueToDataArea(transY0, plot, dataArea);                                    if (y1 == null) {                // NULL value -> insert point on base line                // instead of 'step point'                transX1 = transX0;                transY0 = transY1;                      }            if (transY0 != transY1) {                // not just a horizontal bar but need to perform a 'step'.                if (orientation == PlotOrientation.VERTICAL) {                    this.pArea.addPoint((int) transX1, (int) transY0);                }                else if (orientation == PlotOrientation.HORIZONTAL) {                    this.pArea.addPoint((int) transY0, (int) transX1);                }            }        }                   Shape shape = null;        if (y1 != null) {            // Add each point to Area (x, y)            if (orientation == PlotOrientation.VERTICAL) {                this.pArea.addPoint((int) transX1, (int) transY1);            }            else if (orientation == PlotOrientation.HORIZONTAL) {                this.pArea.addPoint((int) transY1, (int) transX1);            }            if (getPlotShapes()) {                shape = getItemShape(series, item);                if (orientation == PlotOrientation.VERTICAL) {                    shape = ShapeUtilities.createTranslatedShape(                        shape, transX1, transY1                    );                }                else if (orientation == PlotOrientation.HORIZONTAL) {                    shape = ShapeUtilities.createTranslatedShape(                        shape, transY1, transX1                    );                }                if (isShapesFilled()) {                    g2.fill(shape);                }                   else {                    g2.draw(shape);                }               }            else {                if (orientation == PlotOrientation.VERTICAL) {                    shape = new Rectangle2D.Double(                        transX1 - 2, transY1 - 2, 4.0, 4.0                    );                }                else if (orientation == PlotOrientation.HORIZONTAL) {                    shape = new Rectangle2D.Double(                        transY1 - 2, transX1 - 2, 4.0, 4.0                    );                }            }        }        // Check if the item is the last item for the series or if it        // is a NULL value and number of items > 0.  We can't draw an area for         // a single point.        if (getPlotArea() && item > 0 && this.pArea != null                           && (item == (itemCount - 1) || y1 == null)) {            double transY2 = rangeAxis.valueToJava2D(                getRangeBase(), dataArea, plot.getRangeAxisEdge()            );            // avoid possible sun.dc.pr.PRException: endPath: bad path            transY2 = restrictValueToDataArea(transY2, plot, dataArea);                     if (orientation == PlotOrientation.VERTICAL) {                // Add the last point (x,0)                this.pArea.addPoint((int) transX1, (int) transY2);            }            else if (orientation == PlotOrientation.HORIZONTAL) {                // Add the last point (x,0)                this.pArea.addPoint((int) transY2, (int) transX1);            }            // fill the polygon            g2.fill(this.pArea);            // draw an outline around the Area.            if (isOutline()) {                g2.setStroke(plot.getOutlineStroke());                g2.setPaint(plot.getOutlinePaint());                g2.draw(this.pArea);            }            // start new area when needed (see above)            this.pArea = null;        }        // do we need to update the crosshair values?        if (y1 != null) {            updateCrosshairValues(                crosshairState, x1.doubleValue(), y1.doubleValue(),                 transX1, transY1, orientation            );        }        // collect entity and tool tip information...        if (state.getInfo() != null) {            EntityCollection entities                 = state.getInfo().getOwner().getEntityCollection();            if (entities != null && shape != null) {                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);            }        }    }    /**     * 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();    }        /**     * Helper method which returns a value if it lies     * inside the visible dataArea and otherwise the corresponding     * coordinate on the border of the dataArea. The PlotOrientation     * is taken into account.      * Useful to avoid possible sun.dc.pr.PRException: endPath: bad path     * which occurs when trying to draw lines/shapes which in large part     * lie outside of the visible dataArea.     *      * @param value the value which shall be      * @param dataArea  the area within which the data is being drawn.     * @param plot  the plot (can be used to obtain standard color      *              information etc).     * @return <code>double</code> value inside the data area.     */    protected static double restrictValueToDataArea(double value,                                                     XYPlot plot,                                                     Rectangle2D dataArea) {        double min = 0;        double max = 0;        if (plot.getOrientation() == PlotOrientation.VERTICAL) {            min = dataArea.getMinY();            max = dataArea.getMaxY();        }         else if (plot.getOrientation() ==  PlotOrientation.HORIZONTAL) {            min = dataArea.getMinX();            max = dataArea.getMaxX();        }               if (value < min) {            value = min;        }        else if (value > max) {            value = max;        }        return value;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?