TickLevelFormatter不适用于javafx中的值10 20 30等

时间:2014-12-28 10:13:36

标签: java javafx linechart

我不确定为什么会变得困难。我有基于2000年至今的日期数据。 我想绘制特定月份的图表。这是我为系列添加值的代码。

SimpleDateFormat sfMonth= new SimpleDateFormat("MMM");
    SimpleDateFormat sfYear= new SimpleDateFormat("yyyy");
    SimpleDateFormat sfDate= new SimpleDateFormat("dd");
    double baseprice=0;
    XYChart.Series<Number, Number> series=null;
    int currentYear=0;
    for(DayQuote dq:quotes)
    {
        if(baseprice==0)
        {
            baseprice=dq.getClose();
        }
        if(sfMonth.format(dq.getDate()).equals(month))
        {

            int date=  Integer.parseInt(sfDate.format(dq.getDate()));
            if(series==null)
            {
                series= new XYChart.Series<>();
                currentYear=Integer.parseInt(sfYear.format(dq.getDate()));
            }
            double variance=((dq.getClose()-baseprice)/baseprice)*100;
            if(currentYear==Integer.parseInt(sfYear.format(dq.getDate())))
            {
                series.getData().add(new XYChart.Data<Number, Number>(date,variance));
            }
            else
            {
                //System.out.println("Adding Series");
                series.setName((currentYear-1)+"");
                lineChart.getData().add(series);                    
                series= new XYChart.Series<>();
                currentYear=Integer.parseInt(sfYear.format(dq.getDate()));
                series.getData().add(new XYChart.Data<Number, Number>(date,variance));
            }

        }
        else
        {
            baseprice=dq.getClose();

        }
    }

现在,我正在使用Linechart

LineChart<Number, Number> lineChart=(LineChart<Number, Number>) vBox.getChildren().get(2);

我想在XAxis上显示12 / Jan 13 / Jan等,所以我创建了一个TickLevelFormatter。以下是该代码的代码

public class DayTickLevelFormattor extends StringConverter<Number> {
private String month;   
@Override
public Number fromString(String date) {

    return Integer.parseInt(date.split("/")[0]);
}
@Override
public String toString(Number date) {
    //System.out.println("Printed Date"+date.intValue()+"/"+month);
    if(date.intValue()!=10)
    {
        return (date.intValue()+1)+"/"+month;
    }
    else
    {
        System.out.println("Issue");
        return (date.intValue()+1)+"/"+month;
    }
}

public String getMonth() {
    return month;
}

public void setMonth(String month) {
    this.month = month;
}

}

但我的图表没有显示日期10,20等的正确标签。此外,我将XAxis的范围设置为1到30或31但它仍然超出了这个限制并显示33 / Apr(这让我感觉非常笨) 这是我的图表

enter image description here

请让我知道解决此问题的方法。

1 个答案:

答案 0 :(得分:0)

我不知道这是否会回答您的问题,因为没有足够的代码。我的猜测是轴是自动量程的,并且它在每一侧都添加了一些填充。那里也没有0Mar。

我无法看到你在哪里调用setMonth(),但我敢打赌,当它是10的倍数时,在解析日期时会出现一些错误。

您可以使用long(实际java / unix日期)格式化程序并使用d / MMM所需的格式来解决此问题。或者您可以将auto范围设置为false并将边界设置为1 - &gt; 31(3月)并在调用setMonth时发现错误。

顺便说一下,轴格式化程序中有一个后缀功能,但我从未使用它。您可以使用它来添加月份名称,如果它们完全相同的话。 https://docs.oracle.com/javafx/2/api/javafx/scene/chart/NumberAxis.DefaultFormatter.html