我不确定为什么会变得困难。我有基于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(这让我感觉非常笨) 这是我的图表
请让我知道解决此问题的方法。
答案 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