dateaxis.java

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

JAVA
1,787
字号
     * registered listeners.     *     * @param timeline  the timeline.     */    public void setTimeline(Timeline timeline) {        if (this.timeline != timeline) {            this.timeline = timeline;            notifyListeners(new AxisChangeEvent(this));        }    }    /**     * Returns the tick unit for the axis.     *     * @return The tick unit (possibly <code>null</code>).     */    public DateTickUnit getTickUnit() {        return this.tickUnit;    }    /**     * Sets the tick unit for the axis.  The auto-tick-unit-selection flag is      * set to <code>false</code>, and registered listeners are notified that      * the axis has been changed.     *     * @param unit  the tick unit.     */    public void setTickUnit(DateTickUnit unit) {        setTickUnit(unit, true, true);    }    /**     * Sets the tick unit attribute without any other side effects.     *     * @param unit  the new tick unit.     * @param notify  notify registered listeners?     * @param turnOffAutoSelection  turn off auto selection?     */    public void setTickUnit(DateTickUnit unit, boolean notify,                             boolean turnOffAutoSelection) {        this.tickUnit = unit;        if (turnOffAutoSelection) {            setAutoTickUnitSelection(false, false);        }        if (notify) {            notifyListeners(new AxisChangeEvent(this));        }    }    /**     * Returns the date format override.  If this is non-null, then it will be     * used to format the dates on the axis.     *     * @return The formatter (possibly <code>null</code>).     */    public DateFormat getDateFormatOverride() {        return this.dateFormatOverride;    }    /**     * Sets the date format override.  If this is non-null, then it will be      * used to format the dates on the axis.     *     * @param formatter  the date formatter (<code>null</code> permitted).     */    public void setDateFormatOverride(DateFormat formatter) {        this.dateFormatOverride = formatter;        notifyListeners(new AxisChangeEvent(this));    }    /**     * Sets the upper and lower bounds for the axis and sends an      * {@link AxisChangeEvent} to all registered listeners.  As a side-effect,      * the auto-range flag is set to false.     *     * @param range  the new range (<code>null</code> not permitted).     */    public void setRange(Range range) {        setRange(range, true, true);    }    /**     * Sets the range for the axis, if requested, sends an      * {@link AxisChangeEvent} to all registered listeners.  As a side-effect,      * the auto-range flag is set to <code>false</code> (optional).     *     * @param range  the range (<code>null</code> not permitted).     * @param turnOffAutoRange  a flag that controls whether or not the auto      *                          range is turned off.     * @param notify  a flag that controls whether or not listeners are      *                notified.     */    public void setRange(Range range, boolean turnOffAutoRange,                          boolean notify) {        if (range == null) {            throw new IllegalArgumentException("Null 'range' argument.");        }        // usually the range will be a DateRange, but if it isn't do a         // conversion...        if (!(range instanceof DateRange)) {            range = new DateRange(range);        }        super.setRange(range, turnOffAutoRange, notify);    }    /**     * Sets the axis range and sends an {@link AxisChangeEvent} to all      * registered listeners.     *     * @param lower  the lower bound for the axis.     * @param upper  the upper bound for the axis.     */    public void setRange(Date lower, Date upper) {        if (lower.getTime() >= upper.getTime()) {            throw new IllegalArgumentException("Requires 'lower' < 'upper'.");        }        setRange(new DateRange(lower, upper));    }    /**     * Sets the axis range and sends an {@link AxisChangeEvent} to all      * registered listeners.     *     * @param lower  the lower bound for the axis.     * @param upper  the upper bound for the axis.     */    public void setRange(double lower, double upper) {        if (lower >= upper) {            throw new IllegalArgumentException("Requires 'lower' < 'upper'.");        }        setRange(new DateRange(lower, upper));    }    /**     * Returns the earliest date visible on the axis.     *     * @return The date.     */    public Date getMinimumDate() {        Date result = null;        Range range = getRange();        if (range instanceof DateRange) {            DateRange r = (DateRange) range;            result = r.getLowerDate();        }        else {            result = new Date((long) range.getLowerBound());        }        return result;    }    /**     * Sets the minimum date visible on the axis and sends an      * {@link AxisChangeEvent} to all registered listeners.     *     * @param date  the date (<code>null</code> not permitted).     */    public void setMinimumDate(Date date) {        setRange(new DateRange(date, getMaximumDate()), true, false);        notifyListeners(new AxisChangeEvent(this));    }    /**     * Returns the latest date visible on the axis.     *     * @return The date.     */    public Date getMaximumDate() {        Date result = null;        Range range = getRange();        if (range instanceof DateRange) {            DateRange r = (DateRange) range;            result = r.getUpperDate();        }        else {            result = new Date((long) range.getUpperBound());        }        return result;    }    /**     * Sets the maximum date visible on the axis.  An {@link AxisChangeEvent}      * is sent to all registered listeners.     *     * @param maximumDate  the date (<code>null</code> not permitted).     */    public void setMaximumDate(Date maximumDate) {        setRange(new DateRange(getMinimumDate(), maximumDate), true, false);        notifyListeners(new AxisChangeEvent(this));    }    /**     * Returns the tick mark position (start, middle or end of the time period).     *     * @return The position (never <code>null</code>).     */    public DateTickMarkPosition getTickMarkPosition() {        return this.tickMarkPosition;    }    /**     * Sets the tick mark position (start, middle or end of the time period)      * and sends an {@link AxisChangeEvent} to all registered listeners.     *     * @param position  the position (<code>null</code> not permitted).     */    public void setTickMarkPosition(DateTickMarkPosition position) {        if (position == null) {            throw new IllegalArgumentException("Null 'position' argument.");        }        this.tickMarkPosition = position;        notifyListeners(new AxisChangeEvent(this));    }    /**     * Configures the axis to work with the specified plot.  If the axis has     * auto-scaling, then sets the maximum and minimum values.     */    public void configure() {        if (isAutoRange()) {            autoAdjustRange();        }    }    /**     * Returns <code>true</code> if the axis hides this value, and      * <code>false</code> otherwise.     *     * @param millis  the data value.     *     * @return A value.     */    public boolean isHiddenValue(long millis) {        return (!this.timeline.containsDomainValue(new Date(millis)));    }    /**     * Translates the data value to the display coordinates (Java 2D User Space)     * of the chart.     *     * @param value  the date to be plotted.     * @param area  the rectangle (in Java2D space) where the data is to be      *              plotted.     * @param edge  the axis location.     *     * @return The coordinate corresponding to the supplied data value.     */    public double valueToJava2D(double value, Rectangle2D area,                                 RectangleEdge edge) {                value = this.timeline.toTimelineValue((long) value);        DateRange range = (DateRange) getRange();        double axisMin = this.timeline.toTimelineValue(range.getLowerDate());        double axisMax = this.timeline.toTimelineValue(range.getUpperDate());        double result = 0.0;        if (RectangleEdge.isTopOrBottom(edge)) {            double minX = area.getX();            double maxX = area.getMaxX();            if (isInverted()) {                result = maxX + ((value - axisMin) / (axisMax - axisMin))                          * (minX - maxX);            }            else {                result = minX + ((value - axisMin) / (axisMax - axisMin))                          * (maxX - minX);            }        }        else if (RectangleEdge.isLeftOrRight(edge)) {            double minY = area.getMinY();            double maxY = area.getMaxY();            if (isInverted()) {                result = minY + (((value - axisMin) / (axisMax - axisMin))                          * (maxY - minY));            }            else {                result = maxY - (((value - axisMin) / (axisMax - axisMin))                          * (maxY - minY));            }        }        return result;    }    /**     * Translates a date to Java2D coordinates, based on the range displayed by     * this axis for the specified data area.     *     * @param date  the date.     * @param area  the rectangle (in Java2D space) where the data is to be     *              plotted.     * @param edge  the axis location.     *     * @return The coordinate corresponding to the supplied date.     */    public double dateToJava2D(Date date, Rectangle2D area,                                RectangleEdge edge) {          double value = date.getTime();        return valueToJava2D(value, area, edge);    }    /**     * Translates a Java2D coordinate into the corresponding data value.  To      * perform this translation, you need to know the area used for plotting      * data, and which edge the axis is located on.     *     * @param java2DValue  the coordinate in Java2D space.     * @param area  the rectangle (in Java2D space) where the data is to be      *              plotted.     * @param edge  the axis location.     *     * @return A data value.     */    public double java2DToValue(double java2DValue, Rectangle2D area,                                 RectangleEdge edge) {                DateRange range = (DateRange) getRange();        double axisMin = this.timeline.toTimelineValue(range.getLowerDate());        double axisMax = this.timeline.toTimelineValue(range.getUpperDate());        double min = 0.0;        double max = 0.0;        if (RectangleEdge.isTopOrBottom(edge)) {            min = area.getX();            max = area.getMaxX();        }        else if (RectangleEdge.isLeftOrRight(edge)) {            min = area.getMaxY();            max = area.getY();        }        double result;        if (isInverted()) {             result = axisMax - ((java2DValue - min) / (max - min)                       * (axisMax - axisMin));        }        else {             result = axisMin + ((java2DValue - min) / (max - min)                       * (axisMax - axisMin));        }        return this.timeline.toMillisecond((long) result);     }    /**     * Calculates the value of the lowest visible tick on the axis.     *     * @param unit  date unit to use.     *     * @return The value of the lowest visible tick on the axis.

⌨️ 快捷键说明

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