这对我来说很好。我使用以下FXML进行了测试:
<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.layout.AnchorPane?><?import javafx.scene.chart.LineChart?><?import javafx.scene.chart.NumberAxis?><AnchorPane xmlns:fx="http://javafx.com/fxml"> <LineChart fx:id="testChart"> <xAxis><NumberAxis /></xAxis> <yAxis><NumberAxis /></yAxis> </LineChart></AnchorPane>
并测试应用程序:
import javafx.application.Application;import javafx.scene.Scene;import javafx.stage.Stage;public class Main extends Application { @Override public void start(Stage primaryStage) { try { TestChart chart = new TestChart(); Scene scene = new Scene(chart.getAnchorPane(), 600, 400); primaryStage.setScene(scene); primaryStage.show(); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); }}很难说清楚为什么
ClassCastException看不到FXML文件(尤其是所使用的轴),这是很难的。但是,从堆栈跟踪中可以看出,您正在使用
CategoryAxis,与的类型不兼容
LineChart<Number,Number>。
通常,您可以将两种数据类型(一种用于x,一种用于y)声明为所需的任何类型。自从你宣布
@FXMLprivate LineChart<Number, Number> testChart ;
x变量的类型和y变量的类型均为
Number。
参照Javadocs的
LineChart,a
LineChart<X,Y>要求
Axis<X>x轴和
Axis<Y>y轴。因此
Axis<Number>,每个轴都需要一个。A
CategoryAxis是一个
Axis<String>(再次,请参考Javadocs),因此它不能用作折线图的轴:该轴的数据类型与该图表的数据类型不兼容。
如果您在Java中尝试了以下操作:
LineChart<Number, Number> testChart ;testChart = new LineChart<>(new CategoryAxis(), new NumberAxis());
你会得到一个编译错误。由于(大概)要在FXML中初始化轴,并且FXML没有类型检查,因此可以
ClassCastException在运行时获取。
可以帮助您的代码的一件事是使用正确键入的代码
Series:
private XYChart.Series<Number, Number> getDummyData(){ final XYChart.Series<Number, Number> series = new XYChart.Series<>(); series.setName("My portfolio"); // ...}现在,编译器将检查
Series匹配类型是否与图表类型
Data匹配,以及匹配类型是否与图表类型匹配
Series。(因此
series.getData().add(newXYChart.Data("1",23));会产生编译错误,而不是运行时错误。)由于您是在FXML中创建轴的,因此仍然没有对这些轴进行类型检查,但我认为错误的原因(也许)会更加清楚。解决方法是使用
NumberAxis,如上面的示例所示,而不是您的
CategoryAxis。如果您确实想
CategoryAxis在x轴上使用a
,则x值必须为
Strings,因此您需要将
LineChartas 声明为a
LineChart<String,Number>。同样,您将制作
Series一个
Series<String, Number>。



