📄 dateaxis.java
字号:
seconds = 59;
}
calendar.clear(Calendar.MILLISECOND);
calendar.set(years, months, days, value, minutes, seconds);
return calendar.getTime();
case (DateTickUnit.DAY) :
years = calendar.get(Calendar.YEAR);
months = calendar.get(Calendar.MONTH);
if (this.tickMarkPosition == DateTickMarkPosition.START) {
hours = 0;
minutes = 0;
seconds = 0;
}
else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) {
hours = 12;
minutes = 0;
seconds = 0;
}
else {
hours = 23;
minutes = 59;
seconds = 59;
}
calendar.clear(Calendar.MILLISECOND);
calendar.set(years, months, value, hours, 0, 0);
long result = calendar.getTime().getTime();
if (result > date.getTime()) {
calendar.set(years, months, value - 1, hours, 0, 0);
}
return calendar.getTime();
case (DateTickUnit.MONTH) :
years = calendar.get(Calendar.YEAR);
if (this.tickMarkPosition == DateTickMarkPosition.START) {
days = 1;
}
else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) {
days = 15;
}
else {
days = 30;
}
calendar.clear(Calendar.MILLISECOND);
calendar.set(years, value, days, 0, 0, 0);
return calendar.getTime();
case(DateTickUnit.YEAR) :
if (this.tickMarkPosition == DateTickMarkPosition.START) {
months = 0;
}
else if (this.tickMarkPosition == DateTickMarkPosition.MIDDLE) {
months = 6;
}
else {
months = 12;
}
calendar.clear(Calendar.MILLISECOND);
calendar.set(value, months, 0, 0, 0, 0);
return calendar.getTime();
default: return null;
}
}
/**
* Returns the first "standard" date (based on the specified field and units).
*
* @param date the reference date.
* @param unit the date tick unit.
*
* @return the next "standard" date.
*/
protected Date nextStandardDate(Date date, DateTickUnit unit) {
Date previous = previousStandardDate(date, unit);
Calendar calendar = Calendar.getInstance();
calendar.setTime(previous);
calendar.add(unit.getCalendarField(), unit.getCount());
return calendar.getTime();
}
/**
* Returns a collection of standard date tick units. This collection will be used by default,
* but you are free to create your own collection if you want to (see the
* setStandardTickUnits(...) method inherited from the ValueAxis class).
*
* @return a collection of standard date tick units.
*/
public static TickUnits createStandardDateTickUnits() {
TickUnits units = new TickUnits();
// milliseconds
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 1,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 5,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 10,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 25,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 50,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 100,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 250,
new SimpleDateFormat("HH:mm:ss.SSS")));
units.add(new DateTickUnit(DateTickUnit.MILLISECOND, 500,
new SimpleDateFormat("HH:mm:ss.SSS")));
// seconds
units.add(new DateTickUnit(DateTickUnit.SECOND, 1, new SimpleDateFormat("HH:mm:ss")));
units.add(new DateTickUnit(DateTickUnit.SECOND, 5, new SimpleDateFormat("HH:mm:ss")));
units.add(new DateTickUnit(DateTickUnit.SECOND, 10, new SimpleDateFormat("HH:mm:ss")));
units.add(new DateTickUnit(DateTickUnit.SECOND, 30, new SimpleDateFormat("HH:mm:ss")));
// minutes
units.add(new DateTickUnit(DateTickUnit.MINUTE, 1, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 2, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 5, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 10, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 15, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 20, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.MINUTE, 30, new SimpleDateFormat("HH:mm")));
// hours
units.add(new DateTickUnit(DateTickUnit.HOUR, 1, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.HOUR, 2, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.HOUR, 4, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.HOUR, 6, new SimpleDateFormat("HH:mm")));
units.add(new DateTickUnit(DateTickUnit.HOUR, 12, new SimpleDateFormat("d-MMM, HH:mm")));
// days
units.add(new DateTickUnit(DateTickUnit.DAY, 1, new SimpleDateFormat("d-MMM")));
units.add(new DateTickUnit(DateTickUnit.DAY, 2, new SimpleDateFormat("d-MMM")));
units.add(new DateTickUnit(DateTickUnit.DAY, 7, new SimpleDateFormat("d-MMM")));
units.add(new DateTickUnit(DateTickUnit.DAY, 15, new SimpleDateFormat("d-MMM")));
// months
units.add(new DateTickUnit(DateTickUnit.MONTH, 1, new SimpleDateFormat("MMM-yyyy")));
units.add(new DateTickUnit(DateTickUnit.MONTH, 2, new SimpleDateFormat("MMM-yyyy")));
units.add(new DateTickUnit(DateTickUnit.MONTH, 3, new SimpleDateFormat("MMM-yyyy")));
units.add(new DateTickUnit(DateTickUnit.MONTH, 4, new SimpleDateFormat("MMM-yyyy")));
units.add(new DateTickUnit(DateTickUnit.MONTH, 6, new SimpleDateFormat("MMM-yyyy")));
// years
units.add(new DateTickUnit(DateTickUnit.YEAR, 1, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 2, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 5, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 10, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 25, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 50, new SimpleDateFormat("yyyy")));
units.add(new DateTickUnit(DateTickUnit.YEAR, 100, new SimpleDateFormat("yyyy")));
return units;
}
/**
* Rescales the axis to ensure that all data is visible.
*/
protected void autoAdjustRange() {
Plot plot = getPlot();
if (plot == null) {
return; // no plot, no data
}
if (plot instanceof ValueAxisPlot) {
ValueAxisPlot vap = (ValueAxisPlot) plot;
Range r = vap.getDataRange(this);
if (r == null) {
r = new DateRange();
}
long upper = timeline.toTimelineValue((long) r.getUpperBound());
long lower;
long fixedAutoRange = (long) getFixedAutoRange();
if (fixedAutoRange > 0.0) {
lower = upper - fixedAutoRange;
}
else {
lower = timeline.toTimelineValue((long) r.getLowerBound());
double range = upper - lower;
long minRange = (long) getAutoRangeMinimumSize();
if (range < minRange) {
long expand = (long) (minRange - range) / 2;
upper = upper + expand;
lower = lower - expand;
}
upper = upper + (long) (range * getUpperMargin());
lower = lower - (long) (range * getLowerMargin());
}
upper = timeline.toDomainValue(upper);
lower = timeline.toDomainValue(lower);
setRange(new DateRange(new Date(lower), new Date(upper)), false, false);
}
}
/**
* Checks the compatibility of a plot with this type of axis, returning true if the plot is
* compatible and false otherwise.
* <p>
* The VerticalDateAxis class required the plot to implement the VerticalValuePlot interface.
*
* @param plot the plot.
*
* @return a boolean indicating whether the plot is compatible with the axis.
*/
protected boolean isCompatiblePlot(Plot plot) {
return (plot instanceof ValueAxisPlot);
}
/**
* Returns the space required to draw the axis.
*
* @param g2 the graphics device.
* @param plot the plot that the axis belongs to.
* @param plotArea the area within which the plot should be drawn.
* @param edge the axis location (top or bottom).
* @param space the space already reserved.
*
* @return The space.
*/
public AxisSpace reserveSpace(Graphics2D g2, Plot plot, Rectangle2D plotArea,
RectangleEdge edge, AxisSpace space) {
// create a new space object if one wasn't supplied...
if (space == null) {
space = new AxisSpace();
}
this.reservedForAxisLabel = 0.0;
this.reservedForTickLabels = 0.0;
// if the axis is not visible, no additional space is required...
if (!isVisible()) {
return space;
}
// if the axis has a fixed dimension, return it...
double dimension = getFixedDimension();
if (dimension > 0.0) {
space.ensureAtLeast(dimension, edge);
}
// calculate the max size of the tick labels (if visible)...
double tickLabelHeight = 0.0;
double tickLabelWidth = 0.0;
if (isTickLabelsVisible()) {
g2.setFont(getTickLabelFont());
refreshTicks(g2, 0.0, plotArea, plotArea, edge);
Insets tickLabelInsets = getTickLabelInsets();
if (RectangleEdge.isTopOrBottom(edge)) {
tickLabelHeight = tickLabelInsets.top + tickLabelInsets.bottom;
tickLabelHeight += getMaxTickLabelHeight(g2, plotArea, isVerticalTickLabels());
this.reservedForTickLabels = tickLabelHeight;
}
else if (RectangleEdge.isLeftOrRight(edge)) {
tickLabelWidth = tickLabelInsets.left + tickLabelInsets.right;
tickLabelWidth += getMaxTickLabelWidth(g2, plotArea);
this.reservedForTickLabels = tickLabelWidth;
}
}
// get the axis label size and update the space object...
Rectangle2D labelEnclosure = getLabelEnclosure(g2, edge);
double labelHeight = 0.0;
double labelWidth = 0.0;
if (RectangleEdge.isTopOrBottom(edge)) {
labelHeight = labelEnclosure.getHeight();
space.ensureAtLeast(labelHeight + tickLabelHeight, edge);
}
else if (RectangleEdge.isLeftOrRight(edge)) {
labelWidth = labelEnclosure.getWidth();
space.ensureAtLeast(labelWidth + tickLabelWidth, edge);
}
return space;
}
/**
* A utility method for determining the height of the tallest tick label.
*
* @param g2 the graphics device.
* @param drawArea the drawing area.
* @param vertical a flag indicating whether or not the tick labels are rotated to vertical.
*
* @return the maximum tick label height.
*/
private double getMaxTickLabelHeight(Graphics2D g2, Rectangle2D drawArea, boolean vertical) {
Font font = getTickLabelFont();
g2.setFont(font);
FontRenderContext frc = g2.getFontRenderContext();
double maxHeight = 0.0;
if (vertical) {
Iterator iterator = getTicks().iterator();
while (iterator.hasNext()) {
Tick tick = (Tick) iterator.next();
Rectangle2D labelBounds = font.getStringBounds(tick.getText(), frc);
if (labelBounds.getWidth() > maxHeight) {
maxHeight = labelBounds.getWidth();
}
}
}
else {
LineMetrics metrics = font.getLineMetrics("Sample", frc);
maxHeight = metrics.getHeight();
}
return maxHeight;
}
/**
* Selects an appropriate tick value for the axis. The strategy is to
* display as many ticks as possible (selected from an array of 'standard'
* tick units) without the labels overlapping.
*
* @param g2 the graphics device.
* @param drawArea the area in which the plot and axes should be drawn.
* @param dataArea the area defined by the axes.
* @param edge the axis location.
*/
protected void selectAutoTickUnit(Graphics2D g2, Rectangle2D drawArea, Rectangle2D dataArea,
RectangleEdge edge) {
if (RectangleEdge.isTopOrBottom(edge)) {
selectHorizontalAutoTickUnit(g2, drawArea, dataArea, edge);
}
else if (RectangleEdge.isLeftOrRight(edge)) {
selectVerticalAutoTickUnit(g2, drawArea, dataArea, edge);
}
}
/**
* Selects an appropriate tick value for the axis. The strategy is to
* display as many ticks as possible (selected from an array of 'standard'
* tick units) without the labels overlapping.
*
* @param g2 the graphics device.
* @param drawArea the area in which the plot and axes should be drawn.
* @param dataArea the area defined by the axes.
* @param edge the axis location.
*/
protected void selectHorizontalAutoTickUnit(Graphics2D g2, Rectangle2D drawArea,
Rectangle2D dataArea, RectangleEdge edge) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -