📄 dateaxis.java
字号:
* @return the date format override. */ 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. An {@link AxisChangeEvent} is sent 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) { // check arguments... if (lower.getTime() >= upper.getTime()) { throw new IllegalArgumentException("DateAxis.setRange(...): lower not before upper."); } // make the change... setRange(new DateRange(lower, upper)); } /** * Sets the axis range. An {@link AxisChangeEvent} is sent 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) { // check arguments... if (lower >= upper) { throw new IllegalArgumentException("DateAxis.setRange(...): lower >= upper."); } // make the change... setRange(new DateRange(lower, upper)); } /** * Returns the earliest date visible on the axis. * * @return the earliest date visible on the axis. */ 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. An {@link AxisChangeEvent} is sent to all * registered listeners. * * @param minimumDate the new minimum date. */ public void setMinimumDate(Date minimumDate) { setRange(new DateRange(minimumDate, getMaximumDate()), true, false); notifyListeners(new AxisChangeEvent(this)); } /** * Returns the latest date visible on the axis. * * @return the latest date visible on the axis. */ 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 new maximum date. */ 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. */ public DateTickMarkPosition getTickMarkPosition() { return this.tickMarkPosition; } /** * Sets the tick mark position (start, middle or end of the time period). An * {@link AxisChangeEvent} is sent to all registered listeners. * * @param position the new position. */ public void setTickMarkPosition(DateTickMarkPosition position) { 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(new Date((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 translateValueToJava2D(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. */ public Date calculateLowestVisibleTickValue(DateTickUnit unit) { return nextStandardDate(getMinimumDate(), unit); } /** * Calculates the value of the highest visible tick on the axis. * * @param unit date unit to use. * * @return the value of the highest visible tick on the axis. */ public Date calculateHighestVisibleTickValue(DateTickUnit unit) { return previousStandardDate(getMaximumDate(), unit); } /** * Returns the previous "standard" date, for a given date and tick unit. * * @param date the reference date. * @param unit the tick unit. * * @return the previous "standard" date. */ protected Date previousStandardDate(Date date, DateTickUnit unit) { int milliseconds; int seconds; int minutes; int hours; int days; int months; int years; Calendar calendar = Calendar.getInstance(); calendar.setTime(date); int count = unit.getCount(); int current = calendar.get(unit.getCalendarField()); int value = count * (current / count); switch (unit.getUnit()) { case (DateTickUnit.MILLISECOND) : years = calendar.get(Calendar.YEAR); months = calendar.get(Calendar.MONTH); days = calendar.get(Calendar.DATE); hours = calendar.get(Calendar.HOUR_OF_DAY); minutes = calendar.get(Calendar.MINUTE); seconds = calendar.get(Calendar.SECOND); calendar.set(years, months, days, hours, minutes, seconds); calendar.set(Calendar.MILLISECOND, value); return calendar.getTime(); case (DateTickUnit.SECOND) : years = calendar.get(Calendar.YEAR); months = calendar.get(Calendar.MONTH); days = calendar.get(Calendar.DATE); hours = calendar.get(Calendar.HOUR_OF_DAY); minutes = calendar.get(Calendar.MINUTE); if (this.tickMarkPosition == DateTickMarkPosition.START) { milliseconds = 0; } else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) { milliseconds = 500; } else { milliseconds = 999; } calendar.set(Calendar.MILLISECOND, milliseconds); calendar.set(years, months, days, hours, minutes, value); return calendar.getTime(); case (DateTickUnit.MINUTE) : years = calendar.get(Calendar.YEAR); months = calendar.get(Calendar.MONTH); days = calendar.get(Calendar.DATE); hours = calendar.get(Calendar.HOUR_OF_DAY); if (this.tickMarkPosition == DateTickMarkPosition.START) { seconds = 0; } else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) { seconds = 30; } else { seconds = 59; } calendar.clear(Calendar.MILLISECOND); calendar.set(years, months, days, hours, value, seconds); return calendar.getTime(); case (DateTickUnit.HOUR) : years = calendar.get(Calendar.YEAR); months = calendar.get(Calendar.MONTH); days = calendar.get(Calendar.DATE); if (this.tickMarkPosition == DateTickMarkPosition.START) { minutes = 0; seconds = 0; } else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) { minutes = 30; seconds = 0; } else { minutes = 59; seconds = 59; } calendar.clear(Calendar.MILLISECOND);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -