我创建了一个简单的折线图,用于比较当前年份值和过去几年的值(可以是平均值,也可以不是平均值)。
问题是,因为这是出于英国学术目的,所以我希望月份从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图表的漂亮功能吗?
当前使用的资源:
答案 0 :(得分:1)
因此,我遵循了最初的思考过程,尽管它比我最初想象的要复杂得多,并且间隔了不到6个月,但以下工作却适用于6和8。 以下方法将Jan(1)到Dec(12)重排为偏移顺序,例如6月(1)至5月(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);
}
});