我创建了一个简单的折线图,我将当前年份值与过去几年进行比较(可能是平均值还是非平均值)。
问题是,由于这是出于英国学术目的,我希望这些月份从6月到次年6月。
目前我的代码如下:
xAxis.setLabel("Date/Month");
xAxis.setTickLabelRotation(90);
xAxis.setAutoRanging(false);
xAxis.setLowerBound(1);
xAxis.setUpperBound(12);
xAxis.setTickUnit(1.0);
xAxis.setTickLabelFormatter(new StringConverter<Number>() {
@Override
public String toString(Number month) {
logger.debug("Converting " + month);
return new DateFormatSymbols().getMonths()[month.intValue()-1];
}
@Override
public Number fromString(String string) {
try {
Date date = new SimpleDateFormat("MMMM").parse(string);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.MONTH);
} catch (ParseException ex) {
logger.error("Parse Exception");
}
return 0;
}
});
yAxis.setLabel("Units");
使用简单函数创建系列的位置:
private XYChart.Series createSeries(String name, List<AccountUtilities> data) {
XYChart.Series series = new XYChart.Series();
series.setName(name);
for (AccountUtilities utility : data) {
String[] dateParts = utility.getStartdate().split("-");
Double dateCode = Double.valueOf(dateParts[1]);
series.getData().add(new XYChart.Data( dateCode , utility.getGasunits()));
}
return series;
}
我目前的想法是,我可以将月份重新索引为6月= 1,7月= 2等,以便以正确的顺序将值输入到图表中,然后将它们解码为“正确”值6月= 6当我得到setTickLabelFormatter时它的东西,但这似乎有很长的路要走。
javafx图表有一个漂亮的功能,我错过了吗?
目前使用的资源:
所以我遵循了我最初的思考过程,尽管它比我最初认为的更复杂,任何不是6个月的偏移,以下是6和8的工作。以下方法将Jan(1)到Dec(12)重新排序到抵消订单,例如Jun(1)到May(12)所以数据在图表中以所需顺序出现。
private Double getAcademicMonth(String baseDate) {
Integer dateCode = Integer.valueOf(baseDate);
//Any month greater than the accounting start month gets shifted by six.
if (dateCode > offset) { dateCode = dateCode - offset; }
else { dateCode = dateCode + (12-offset); }
return dateCode;
}
然后,当绘制图表时,我需要一种手动转换月份,因此我得到了正确的月份标签,这是通过setTickLabelFormatter实现的
//We have to set tick label formatter now once the offset has been retrieved.
xAxis.setTickLabelFormatter(new StringConverter<Number>() {
@Override
public String toString(Number month) {
//Shift our months to account for the accounting start month
int dateCode = month.intValue();
if (dateCode <= (12 - offset) ) { dateCode = dateCode + offset; }
else { dateCode = dateCode - (12-offset); }
Month day = Month.of(dateCode);
return day.getDisplayName(TextStyle.SHORT, Locale.ENGLISH);
}
@Override
public Number fromString(String string) {
DateTimeFormatter parser = DateTimeFormatter.ofPattern("MMMM").withLocale(Locale.ENGLISH);
TemporalAccessor accessor = parser.parse(string);
return accessor.get(ChronoField.MONTH_OF_YEAR);
}
});