waterfallbarrenderer.java

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

JAVA
537
字号
     * Sets the paint that will be used to draw bars having negative values.     *     * @param paint  the paint (<code>null</code> not permitted).     */    public void setNegativeBarPaint(Paint paint) {        if (paint == null) {            throw new IllegalArgumentException("Null 'paint' argument");           }        this.negativeBarPaint = paint;        notifyListeners(new RendererChangeEvent(this));    }    /**     * Draws the bar for a single (series, category) data item.     *     * @param g2  the graphics device.     * @param state  the renderer state.     * @param dataArea  the data area.     * @param plot  the plot.     * @param domainAxis  the domain axis.     * @param rangeAxis  the range axis.     * @param dataset  the dataset.     * @param row  the row index (zero-based).     * @param column  the column index (zero-based).     * @param pass  the pass index.     */    public void drawItem(Graphics2D g2,                         CategoryItemRendererState state,                         Rectangle2D dataArea,                         CategoryPlot plot,                         CategoryAxis domainAxis,                         ValueAxis rangeAxis,                         CategoryDataset dataset,                         int row,                         int column,                         int pass) {        double previous = state.getSeriesRunningTotal();        if (column == dataset.getColumnCount() - 1) {            previous = 0.0;        }        double current = 0.0;        Number n = dataset.getValue(row, column);        if (n != null) {            current = previous + n.doubleValue();        }        state.setSeriesRunningTotal(current);                int seriesCount = getRowCount();        int categoryCount = getColumnCount();        PlotOrientation orientation = plot.getOrientation();                double rectX = 0.0;        double rectY = 0.0;        RectangleEdge domainAxisLocation = plot.getDomainAxisEdge();        RectangleEdge rangeAxisLocation = plot.getRangeAxisEdge();                // Y0        double j2dy0 = rangeAxis.valueToJava2D(            previous, dataArea, rangeAxisLocation        );        // Y1        double j2dy1 = rangeAxis.valueToJava2D(            current, dataArea, rangeAxisLocation        );        double valDiff = current - previous;        if (j2dy1 < j2dy0) {            double temp = j2dy1;            j2dy1 = j2dy0;            j2dy0 = temp;        }        // BAR WIDTH        double rectWidth = state.getBarWidth();        // BAR HEIGHT        double rectHeight = Math.max(            getMinimumBarLength(), Math.abs(j2dy1 - j2dy0)        );        if (orientation == PlotOrientation.HORIZONTAL) {            // BAR Y            rectY = domainAxis.getCategoryStart(                column, getColumnCount(), dataArea, domainAxisLocation            );            if (seriesCount > 1) {                double seriesGap = dataArea.getHeight() * getItemMargin()                                   / (categoryCount * (seriesCount - 1));                rectY = rectY + row * (state.getBarWidth() + seriesGap);            }            else {                rectY = rectY + row * state.getBarWidth();            }                         rectX = j2dy0;            rectHeight = state.getBarWidth();            rectWidth = Math.max(                getMinimumBarLength(), Math.abs(j2dy1 - j2dy0)            );        }        else if (orientation == PlotOrientation.VERTICAL) {            // BAR X            rectX = domainAxis.getCategoryStart(                column, getColumnCount(), dataArea, domainAxisLocation            );            if (seriesCount > 1) {                double seriesGap = dataArea.getWidth() * getItemMargin()                                   / (categoryCount * (seriesCount - 1));                rectX = rectX + row * (state.getBarWidth() + seriesGap);            }            else {                rectX = rectX + row * state.getBarWidth();            }            rectY = j2dy0;        }        Rectangle2D bar = new Rectangle2D.Double(            rectX, rectY, rectWidth, rectHeight        );        Paint seriesPaint = getFirstBarPaint();        if (column == 0) {            seriesPaint = getFirstBarPaint();        }        else if (column == categoryCount - 1) {            seriesPaint = getLastBarPaint();            }         else {            if (valDiff < 0.0) {                seriesPaint = getNegativeBarPaint();            }             else if (valDiff > 0.0) {                seriesPaint = getPositiveBarPaint();            }             else {                seriesPaint = getLastBarPaint();            }        }        if (getGradientPaintTransformer() != null                 && seriesPaint instanceof GradientPaint) {            GradientPaint gp = (GradientPaint) seriesPaint;            seriesPaint = getGradientPaintTransformer().transform(gp, bar);        }        g2.setPaint(seriesPaint);        g2.fill(bar);                // draw the outline...        if (isDrawBarOutline()                 && state.getBarWidth() > BAR_OUTLINE_WIDTH_THRESHOLD) {            Stroke stroke = getItemOutlineStroke(row, column);            Paint paint = getItemOutlinePaint(row, column);            if (stroke != null && paint != null) {                g2.setStroke(stroke);                g2.setPaint(paint);                g2.draw(bar);            }        }                CategoryItemLabelGenerator generator             = getItemLabelGenerator(row, column);        if (generator != null && isItemLabelVisible(row, column)) {            drawItemLabel(                g2, dataset, row, column, plot, generator, bar, (valDiff < 0.0)            );        }                // collect entity and tool tip information...        if (state.getInfo() != null) {            EntityCollection entities                 = state.getInfo().getOwner().getEntityCollection();            if (entities != null) {                String tip = null;                CategoryToolTipGenerator tipster                     = getToolTipGenerator(row, column);                if (tipster != null) {                    tip = tipster.generateToolTip(dataset, row, column);                }                String url = null;                if (getItemURLGenerator(row, column) != null) {                    url = getItemURLGenerator(row, column).generateURL(                        dataset, row, column                    );                }                CategoryItemEntity entity = new CategoryItemEntity(                    bar, tip, url, dataset, row,                     dataset.getColumnKey(column), column                );                entities.add(entity);            }        }    }        /**     * Tests an object for equality with this instance.     *      * @param obj  the object (<code>null</code> permitted).     *      * @return A boolean.     */    public boolean equals(Object obj) {                if (obj == this) {            return true;        }        if (!super.equals(obj)) {            return false;        }        if (!(obj instanceof WaterfallBarRenderer)) {            return false;        }        WaterfallBarRenderer that = (WaterfallBarRenderer) obj;        if (!PaintUtilities.equal(this.firstBarPaint, that.firstBarPaint)) {            return false;        }        if (!PaintUtilities.equal(this.lastBarPaint, that.lastBarPaint)) {            return false;        }                     if (!PaintUtilities.equal(this.positiveBarPaint,                 that.positiveBarPaint)) {            return false;        }                     if (!PaintUtilities.equal(this.negativeBarPaint,                 that.negativeBarPaint)) {            return false;        }                     return true;            }        /**     * Provides serialization support.     *     * @param stream  the output stream.     *     * @throws IOException  if there is an I/O error.     */    private void writeObject(ObjectOutputStream stream) throws IOException {        stream.defaultWriteObject();        SerialUtilities.writePaint(this.firstBarPaint, stream);        SerialUtilities.writePaint(this.lastBarPaint, stream);        SerialUtilities.writePaint(this.positiveBarPaint, stream);        SerialUtilities.writePaint(this.negativeBarPaint, stream);    }    /**     * Provides serialization support.     *     * @param stream  the input stream.     *     * @throws IOException  if there is an I/O error.     * @throws ClassNotFoundException  if there is a classpath problem.     */    private void readObject(ObjectInputStream stream)         throws IOException, ClassNotFoundException {        stream.defaultReadObject();        this.firstBarPaint = SerialUtilities.readPaint(stream);        this.lastBarPaint = SerialUtilities.readPaint(stream);        this.positiveBarPaint = SerialUtilities.readPaint(stream);        this.negativeBarPaint = SerialUtilities.readPaint(stream);    }}

⌨️ 快捷键说明

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