【发布时间】:2016-12-19 15:38:11
【问题描述】:
对于一个个人项目,我创建了一个程序,可以毫无问题地从 markitondemand.com 获取股票数据。在一个对象中,我将一些值存储在一个 HashMap 的值字段中。
现在我想在 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)
在stacktrace中没有链接到我自己的代码,所以我不知道如何解决这个问题。
我循环遍历这些值,以便将它们添加到用作折线图数据的系列中。 代码示例: (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,但我不知道如何解决这个问题。
提前致谢!
编辑
正如在 cmets 中提到的,堆栈跟踪引用了 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)返回一个字符串,而您正试图将其用作数字。 -
stockToDraw 是
的 HashMap ? -
@Steven Nope, HashMap
-
所以这里有很多问题。首先,初始化带有
@FXML注释的变量总是是一个错误。您将lineChart初始化为new LineChart<Number, Number>,但是当您加载FXML 文件时,FXMLLoader将分配lineChartFXML 文件中定义的元素 - 即带有CategoryAxis的LineChart和NumberAxis。由于CategoryAxis扩展了Axis<String>,因此折线图现在期望x-values 为Strings。您正在为两个坐标传递Numbers:因此ClassCastException。 -
所以根本不清楚你到底打算做什么。如果您希望两个轴都是数字,为什么要在 FXML 文件中设置
CategoryAxis?
标签: java javafx classcastexception