Javafx 给出XAxis学术月份顺序的折线图

Javafx 给出XAxis学术月份顺序的折线图,javafx,linechart,Javafx,Linechart,我创建了一个简单的折线图,将当前年份的值与过去年份的值进行比较,可以是平均值,也可以不是平均值 问题是,由于这是出于英国学术目的,我希望这几个月从6月一直持续到次年6月 当前我的代码如下所示: xAxis.setLabel("Date/Month"); xAxis.setTickLabelRotation(90); xAxis.setAutoRanging(false); xAxis.setLowerBound(1); xAxis.setUpperBound(1

我创建了一个简单的折线图,将当前年份的值与过去年份的值进行比较,可以是平均值,也可以不是平均值

问题是,由于这是出于英国学术目的,我希望这几个月从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日等,以正确的顺序将值放入图表中,然后在我使用setTickLabelFormatter进行操作时将其解码为“正确”值6月6日,但这似乎是一个很长的路要走

javafx图表是否有一个我没有的漂亮特性

目前使用的资源:


因此,我遵循了我最初的思考过程,虽然它比我最初认为的更复杂,任何补偿都不是6个月,但接下来的6个月和8个月都有效。 以下方法将1月1日至12月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);
        }

    });

你为什么仍然使用过时且设计拙劣的Date、Calendar和SimpleDateFormat类?和他一起工作要好得多。在我看来,你想要。因为我的知识大约是2000年,我正在更新?谢谢你的知识-我会更新的。@OleV.V。再次感谢你的建议。希望我下面更新的答案更符合当前的最佳实践。它肯定是+1。这应该对未来的读者有所帮助,谢谢。。。xAxis是什么类型的?分类轴不适合您的需要吗?如果没有的话,还有DateAxis,它允许根据LocalDate设置开始,这正是我所寻找的知识。谢谢TBH这对我现在来说效果很好。