dateaxis.java

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

JAVA
1,787
字号
     * @param g2  the graphics device.     * @param state  the axis state.     * @param dataArea  the area in which the plot should be drawn.     * @param edge  the location of the axis.     *     * @return A list of ticks.     */    public List refreshTicks(Graphics2D g2,                             AxisState state,                             Rectangle2D dataArea,                             RectangleEdge edge) {        List result = null;        if (RectangleEdge.isTopOrBottom(edge)) {            result = refreshTicksHorizontal(g2, dataArea, edge);        }        else if (RectangleEdge.isLeftOrRight(edge)) {            result = refreshTicksVertical(g2, dataArea, edge);        }        return result;    }    /**     * Recalculates the ticks for the date axis.     *     * @param g2  the graphics device.     * @param dataArea  the area in which the data is to be drawn.     * @param edge  the location of the axis.     *     * @return A list of ticks.     */    protected List refreshTicksHorizontal(Graphics2D g2,                                          Rectangle2D dataArea,                                          RectangleEdge edge) {        List result = new java.util.ArrayList();        Font tickLabelFont = getTickLabelFont();        g2.setFont(tickLabelFont);        if (isAutoTickUnitSelection()) {            selectAutoTickUnit(g2, dataArea, edge);        }        DateTickUnit unit = getTickUnit();        Date tickDate = calculateLowestVisibleTickValue(unit);        Date upperDate = getMaximumDate();        // float lastX = Float.MIN_VALUE;        while (tickDate.before(upperDate)) {            if (!isHiddenValue(tickDate.getTime())) {                // work out the value, label and position                String tickLabel;                DateFormat formatter = getDateFormatOverride();                if (formatter != null) {                    tickLabel = formatter.format(tickDate);                }                else {                    tickLabel = this.tickUnit.dateToString(tickDate);                }                TextAnchor anchor = null;                TextAnchor rotationAnchor = null;                double angle = 0.0;                if (isVerticalTickLabels()) {                    anchor = TextAnchor.CENTER_RIGHT;                    rotationAnchor = TextAnchor.CENTER_RIGHT;                    if (edge == RectangleEdge.TOP) {                        angle = Math.PI / 2.0;                    }                    else {                        angle = -Math.PI / 2.0;                    }                }                else {                    if (edge == RectangleEdge.TOP) {                        anchor = TextAnchor.BOTTOM_CENTER;                        rotationAnchor = TextAnchor.BOTTOM_CENTER;                    }                    else {                        anchor = TextAnchor.TOP_CENTER;                        rotationAnchor = TextAnchor.TOP_CENTER;                    }                }                Tick tick = new DateTick(                    tickDate, tickLabel, anchor, rotationAnchor, angle                );                result.add(tick);                tickDate = unit.addToDate(tickDate);            }            else {                tickDate = unit.rollDate(tickDate);                continue;            }            // could add a flag to make the following correction optional...            switch (unit.getUnit()) {                case (DateTickUnit.MILLISECOND) :                case (DateTickUnit.SECOND) :                case (DateTickUnit.MINUTE) :                case (DateTickUnit.HOUR) :                case (DateTickUnit.DAY) :                    break;                case (DateTickUnit.MONTH) :                    tickDate = calculateDateForPosition(                        new Month(tickDate), this.tickMarkPosition                    );                    break;                case(DateTickUnit.YEAR) :                    tickDate = calculateDateForPosition(                        new Year(tickDate), this.tickMarkPosition                    );                    break;                default: break;            }        }        return result;    }    /**     * Recalculates the ticks for the date axis.     *     * @param g2  the graphics device.     * @param dataArea  the area in which the plot should be drawn.     * @param edge  the location of the axis.     *     * @return A list of ticks.     */    protected List refreshTicksVertical(Graphics2D g2,                                        Rectangle2D dataArea,                                        RectangleEdge edge) {        List result = new java.util.ArrayList();        Font tickLabelFont = getTickLabelFont();        g2.setFont(tickLabelFont);        if (isAutoTickUnitSelection()) {            selectAutoTickUnit(g2, dataArea, edge);        }        DateTickUnit unit = getTickUnit();        Date tickDate = calculateLowestVisibleTickValue(unit);        //Date upperDate = calculateHighestVisibleTickValue(unit);        Date upperDate = getMaximumDate();        while (tickDate.before(upperDate)) {            if (!isHiddenValue(tickDate.getTime())) {                // work out the value, label and position                String tickLabel;                DateFormat formatter = getDateFormatOverride();                if (formatter != null) {                    tickLabel = formatter.format(tickDate);                }                else {                    tickLabel = this.tickUnit.dateToString(tickDate);                }                TextAnchor anchor = null;                TextAnchor rotationAnchor = null;                double angle = 0.0;                if (isVerticalTickLabels()) {                    anchor = TextAnchor.BOTTOM_CENTER;                    rotationAnchor = TextAnchor.BOTTOM_CENTER;                    if (edge == RectangleEdge.LEFT) {                        angle = -Math.PI / 2.0;                    }                    else {                        angle = Math.PI / 2.0;                    }                }                else {                    if (edge == RectangleEdge.LEFT) {                        anchor = TextAnchor.CENTER_RIGHT;                        rotationAnchor = TextAnchor.CENTER_RIGHT;                    }                    else {                        anchor = TextAnchor.CENTER_LEFT;                        rotationAnchor = TextAnchor.CENTER_LEFT;                    }                }                Tick tick = new DateTick(                    tickDate, tickLabel, anchor, rotationAnchor, angle                );                result.add(tick);                tickDate = unit.addToDate(tickDate);            }            else {                tickDate = unit.rollDate(tickDate);            }        }        return result;    }    /**     * Draws the axis on a Java 2D graphics device (such as the screen or a      * printer).     *     * @param g2  the graphics device (<code>null</code> not permitted).     * @param cursor  the cursor location.     * @param plotArea  the area within which the axes and data should be      *                  drawn (<code>null</code> not permitted).     * @param dataArea  the area within which the data should be drawn      *                  (<code>null</code> not permitted).     * @param edge  the location of the axis (<code>null</code> not permitted).     * @param plotState  collects information about the plot      *                   (<code>null</code> permitted).     *     * @return The axis state (never <code>null</code>).     */    public AxisState draw(Graphics2D g2,                           double cursor,                          Rectangle2D plotArea,                           Rectangle2D dataArea,                           RectangleEdge edge,                          PlotRenderingInfo plotState) {        // if the axis is not visible, don't draw it...        if (!isVisible()) {            AxisState state = new AxisState(cursor);            // even though the axis is not visible, we need to refresh ticks in            // case the grid is being drawn...            List ticks = refreshTicks(g2, state, dataArea, edge);            state.setTicks(ticks);            return state;        }        // draw the tick marks and labels...        AxisState state = drawTickMarksAndLabels(            g2, cursor, plotArea, dataArea, edge        );        // draw the axis label (note that 'state' is passed in *and*         // returned)...        state = drawLabel(getLabel(), g2, plotArea, dataArea, edge, state);        return state;    }    /**     * Zooms in on the current range.     *     * @param lowerPercent  the new lower bound.     * @param upperPercent  the new upper bound.     */    public void zoomRange(double lowerPercent, double upperPercent) {        double start = this.timeline.toTimelineValue(            (long) getRange().getLowerBound()        );        double length = (this.timeline.toTimelineValue(                (long) getRange().getUpperBound())                 - this.timeline.toTimelineValue(                    (long) getRange().getLowerBound()        ));        Range adjusted = null;        if (isInverted()) {            adjusted = new DateRange(                this.timeline.toMillisecond(                    (long) (start + (length * (1 - upperPercent)))                ),                this.timeline.toMillisecond(                    (long) (start + (length * (1 - lowerPercent)))                )            );        }        else {            adjusted = new DateRange(this.timeline.toMillisecond(                (long) (start + length * lowerPercent)),                this.timeline.toMillisecond(                    (long) (start + length * upperPercent)                )            );        }        setRange(adjusted);    }         /**     * Tests an object for equality with this instance.     *     * @param obj  the object to test.     *     * @return A boolean.     */    public boolean equals(Object obj) {        if (obj == this) {            return true;        }        if (!(obj instanceof DateAxis)) {            return false;        }        DateAxis that = (DateAxis) obj;        if (!ObjectUtilities.equal(this.tickUnit, that.tickUnit)) {            return false;        }        if (!ObjectUtilities.equal(            this.dateFormatOverride, that.dateFormatOverride)        ) {            return false;        }        if (!ObjectUtilities.equal(            this.tickMarkPosition, that.tickMarkPosition        )) {            return false;        }        if (!ObjectUtilities.equal(this.timeline, that.timeline)) {            return false;        }        return true;    }    /**     * Returns a hash code for this object.     *      * @return A hash code.     */    public int hashCode() {        if (getLabel() != null) {            return getLabel().hashCode();        }        else {            return 0;        }    }    /**     * Returns a clone of the object.     *     * @return A clone.     *     * @throws CloneNotSupportedException if some component of the axis does      *         not support cloning.     */    public Object clone() throws CloneNotSupportedException {        DateAxis clone = (DateAxis) super.clone();        // 'dateTickUnit' is immutable : no need to clone        if (this.dateFormatOverride != null) {            clone.dateFormatOverride                 = (DateFormat) this.dateFormatOverride.clone();        }        // 'tickMarkPosition' is immutable : no need to clone        return clone;    }            }

⌨️ 快捷键说明

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