gpt4 book ai didi

JavaFX LineChart/AreaChart x 轴 (CategoryAxis) 上的错误排序值

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:35 32 4
gpt4 key购买 nike

当尝试构建包含可更新的 LineChartAreaChart 的应用程序时,我发现了奇怪的行为 - 可能是由于应用程序逻辑中的错误?

目标是在单击“生成”按钮时将数据填充到图表中或更新图表。用户必须输入图表的开始时间和结束时间,此外还必须选择间隔小时/天/周(通过使用 RadioGroup)。

初始图表的创建没有任何问题。重新生成图表也能正常工作,但前提是之前的图表中不存在数据点。如果两个图表(旧图表和更新图表)中都包含具有相同 x 值的数据点,则排序不再升序。

例子:

执行开始日期:01.09.2013结束日期:25.09.2013间隔:周

x 轴上的值:

01.09.2013/08.09.2013/15.09.2013/22.09.2013

点击“Days”RadioButton 重新生成图表会在 x 轴上产生以下值:

01.09.2013/08.09.2013/15.09.2013/22.09.2013/02.09.2013/03.09.2013/04.09.2013/...

(值应为 01.09.2013/02.09.2013/03.09.2013/...)

已经显示在第一个图表中并且也在第二个图表中的所有值都在新图表的开头排序(而不是按升序排列)

下面是实现该技巧的代码(方法 initializeTimeline 的代码仅用于测试目的(肯定有点可优化 ;))):

public class ChartDesignController implements Initializable {
@FXML
private AreaChart chartOne;
@FXML
private TextField startDate;
@FXML
private TextField endDate;
@FXML
private RadioButton radioHours;
@FXML
private RadioButton radioDays;
@FXML
private RadioButton radioWeeks;
@FXML
private ToggleGroup timeUnit;
@FXML
private Label msgBox;

@FXML
private void generateGraph(ActionEvent event) {
String timeUnit = getTimeUnit();
Series s = initializeTimeline(startDate.getText(), endDate.getText(), timeUnit);
chartOne.getData().setAll(s);
}

private String getTimeUnit() {
String timeUnitForQuery = "DD";
RadioButton selectedRadio = (RadioButton) timeUnit.getSelectedToggle();
if (selectedRadio == radioHours) {
//System.out.println("RadioHours was selected");
timeUnitForQuery = "HH24";
}
if (selectedRadio == radioDays) {
//System.out.println("RadioDays was selected");
timeUnitForQuery = "DD";
}
if (selectedRadio == radioWeeks) {
//System.out.println("RadioWeeks was selected");
timeUnitForQuery = "IW";
}
//System.out.println("Time unit changed");
return timeUnitForQuery;
}

@Override
public void initialize(URL url, ResourceBundle rb) {
}

private Series initializeTimeline(String startTime, String endTime, String timeUnit) {
msgBox.setText("");
long delta;
int nrOfTicks = 0;
Data<String, Integer> dp;
Series s = new Series();
ArrayList<Data<String, Integer>> dataPoints = new ArrayList();
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
Date startDate = new Date();
Date endDate = new Date();
GregorianCalendar startTimeGC = new GregorianCalendar();
GregorianCalendar endTimeGC = new GregorianCalendar();
if (timeUnit.equalsIgnoreCase("HH24")) {
sdf = new SimpleDateFormat("dd.MM.yyyy HH");
}
try {
startDate = sdf.parse(startTime);
endDate = sdf.parse(endTime);
} catch (ParseException ex) {
msgBox.setText(ex.getMessage() + "\n" + "Format expected: " + sdf.toPattern());
}
startTimeGC.setTimeInMillis(startDate.getTime());
endTimeGC.setTimeInMillis(endDate.getTime());
delta = endTimeGC.getTimeInMillis() - startTimeGC.getTimeInMillis();
if (timeUnit.equalsIgnoreCase("HH24")) {
nrOfTicks = (int) (delta / 1000 / 60 / 60) + 1;
} else if (timeUnit.equalsIgnoreCase("DD")) {
nrOfTicks = (int) (delta / 1000 / 60 / 60 / 24) + 1;
} else if (timeUnit.equalsIgnoreCase("IW")) {
nrOfTicks = (int) (delta / 1000 / 60 / 60 / 24 / 7) + 1;
}
for (int i = 0; i < nrOfTicks; i++) {
dp = new Data(sdf.format(startTimeGC.getTime()), 0);
dataPoints.add(dp);
if (timeUnit.equalsIgnoreCase("HH24")) {
startTimeGC.add(GregorianCalendar.HOUR_OF_DAY, 1);
} else if (timeUnit.equalsIgnoreCase("DD")) {
startTimeGC.add(GregorianCalendar.DAY_OF_MONTH, 1);
} else if (timeUnit.equalsIgnoreCase("IW")) {
startTimeGC.add(GregorianCalendar.WEEK_OF_YEAR, 1);;
}
}
dataPoints.sort(new DataComparator());
s.setData(FXCollections.observableList(dataPoints));
return s;
}
}

下面是 DataComparator,它负责根据 x 值按字母顺序对 dataPoints 进行排序:

public class DataComparator implements Comparator<Data> {
@Override
public int compare(Data d1, Data d2) {
String d1Xval = (String) d1.getXValue();
String d2Xval = (String) d2.getXValue();
return d1Xval.compareTo(d2Xval);
}
}

调试时,程序值在 ArrayList dataPoints 中正确排序。

任何想法为什么值在图表 x 轴中排序不正确,以防它们已经出现在旧图表中?

非常感谢对这个“问题”的帮助。

最佳答案

我遇到了同样的问题。无论我如何设置绘图,排序总是会因使用新数据点重新绘制而弄乱。唯一的修复是使用 java 1.8。

这是当时最新的 fx,2.2.51-b13。必须与 fx8 早期访问版本一起使用。

关于JavaFX LineChart/AreaChart x 轴 (CategoryAxis) 上的错误排序值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19264919/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com