JavaFX 折线图 类型转换异常 Integer 转 String

4

我创建了一个个人项目,从markitondemand.com获取股票数据的程序。在一个对象中,我将一些值存储在值字段中,该字段是哈希映射。

现在我想在JavaFX中的线图中显示该对象的值。目前我遇到了以下异常:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at javafx.scene.chart.CategoryAxis.calculateRequiredSize(CategoryAxis.java:378)
at javafx.scene.chart.CategoryAxis.autoRange(CategoryAxis.java:363)
at javafx.scene.chart.Axis.computePrefHeight(Axis.java:577)
at javafx.scene.Parent.prefHeight(Parent.java:927)
at javafx.scene.layout.Region.prefHeight(Region.java:1435)
at javafx.scene.chart.XYChart.layoutChartChildren(XYChart.java:687)
at javafx.scene.chart.Chart$1.layoutChildren(Chart.java:94)
at javafx.scene.Parent.layout(Parent.java:1079)
at javafx.scene.Parent.layout(Parent.java:1085)
at javafx.scene.Parent.layout(Parent.java:1085)
at javafx.scene.Scene.doLayoutPass(Scene.java:552)
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397)
at com.sun.javafx.tk.Toolkit.lambda$runPulse$31(Toolkit.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354)
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510)
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490)
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$405(QuantumToolkit.java:319)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

在堆栈跟踪中没有指向我的代码的链接,因此我不知道如何解决这个问题。
这是获取苹果公司价值的屏幕截图: Values for object from Apple's stock 我循环遍历这些值,以便将它们添加到用作折线图数据的系列中。 代码示例: (stockToDraw.getValues() 返回屏幕截图中显示的值)
int i = 1;
    for(String key : stockToDraw.getValues().keySet()) {
        series.getData().add(new XYChart.Data<Number, Number>(i, stockToDraw.getValues().get(key)));
        i++;
    }

我的折线图声明如下:

final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();

@FXML
LineChart<Number, Number> lineChart = new LineChart<Number, Number>(xAxis, yAxis);

XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();

通过以上代码示例,我遇到了一个 ClassCastException 错误,指出 Integer 无法转换为 String,但我不知道如何解决这个问题。
提前致谢!
编辑:
正如评论中所提到的,堆栈跟踪引用了 CategoryAxis。这个轴在 FXML 代码中包含如下:
<LineChart fx:id="lineChart" layoutX="9.0" layoutY="120.0" prefHeight="470.0" prefWidth="581.0">
    <xAxis>
      <CategoryAxis label="Days" side="BOTTOM" />
    </xAxis>
    <yAxis>
      <NumberAxis label="Value" side="LEFT" />
    </yAxis>
  </LineChart>

看起来 stockToDraw.getValues().get(key) 返回一个字符串,而你正在尝试将其用作数字。 - markbernard
stockToDraw 是一个 <String, Integer> 类型的 HashMap 吗? - Steven
@markbernard 我尝试将其更改为(Number) Double.valueOf(stockToDraw.getValues().get(key))Double.valueOf(stockToDraw.getValues().get(key)),但没有成功。 - Jules
2
所以这里有很多问题。首先,将被注解为@FXML的变量初始化是一个错误。你将lineChart初始化为new LineChart<Number, Number>,但是当加载FXML文件时,FXMLLoader会将lineChart赋值为在FXML文件中定义的元素 - 即一个带有CategoryAxisNumberAxisLineChart。由于CategoryAxis扩展了Axis<String>,线图现在期望x值为String。而你传入的是两个坐标的Number:因此出现了ClassCastException - James_D
1
所以你实际想要做什么并不清楚。如果你想要两个轴都是数字,为什么在FXML文件中设置了一个CategoryAxis - James_D
显示剩余4条评论
1个回答

1
正如评论中@James_D所指出的,我多次初始化了折线图。
我删除了初始化程序并将其更改为:
@FXML
LineChart<String, Double> lineChart;

在所有必要的地方,我将XYChart.Series<Number, Number>更改为XYChart.Series<String, Double>
之后,我进行了测试,并得到了以下结果: 工作线图的结果

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接