JavaFX LineChart – 由于Axis的类型而导致ClassCastException
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaFX LineChart – 由于Axis的类型而导致ClassCastException,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5057字,纯文字阅读大概需要8分钟。
内容图文
![JavaFX LineChart – 由于Axis的类型而导致ClassCastException](/upload/InfoBanner/zyjiaocheng/705/9322d0fed8ff4a1397c1b9be807314f9.jpg)
如何从FXML文件中指定图表的轴类型?看起来默认类型是< String,Integer>.如果我将我的可注射字段声明为LineChart< Number,Number> lineChart,我用(Number,Number)创建一个数据系列,程序抛出一个ClassCastException.
必须使用FXML文件.最糟糕的情况是我手动创建了我的图表.我最好的猜测是这是一个错误.
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.AnchorPane;
/**
*
* @author ggrec
*
*/
public class TestChart implements Initializable
{
// ====================== 2. Instance Fields =============================
@FXML
private LineChart<Number, Number> testChart;
private AnchorPane anchorPane;
// ==================== 4. Constructors ====================
public TestChart()
{
final FXMLLoader fxmlLoader = new FXMLLoader( TestChart.class.getResource("testChart.fxml") );
fxmlLoader.setController(this);
try
{
anchorPane = (AnchorPane) fxmlLoader.load();
}
catch (final IOException e)
{
e.printStackTrace();
}
}
// ==================== 5. Creators ====================
@Override
public void initialize(final URL arg0, final ResourceBundle arg1)
{
// testChart.getXAxis().setAutoRanging(true);
// testChart.getYAxis().setAutoRanging(true);
testChart.getData().add(getDummyData());
}
// ==================== 7. Getters & Setters ====================
public AnchorPane getAnchorPane()
{
return anchorPane;
}
// ==================== 13. Utility Methods ====================
private XYChart.Series getDummyData()
{
final XYChart.Series series = new XYChart.Series();
series.setName("My portfolio");
series.getData().add(new XYChart.Data<Number, Number>(1, 23)); // Works for ("1", 23)
// series.getData().add(new XYChart.Data("2", 14));
// series.getData().add(new XYChart.Data("3", 15));
// series.getData().add(new XYChart.Data("4", 24));
// series.getData().add(new XYChart.Data("5", 34));
// series.getData().add(new XYChart.Data("6", 36));
// series.getData().add(new XYChart.Data("7", 22));
// series.getData().add(new XYChart.Data("8", 45));
// series.getData().add(new XYChart.Data("9", 43));
// series.getData().add(new XYChart.Data("10", 17));
// series.getData().add(new XYChart.Data("11", 29));
// series.getData().add(new XYChart.Data("12", 25));
return series;
}
}
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at javafx.scene.chart.CategoryAxis.invalidateRange(CategoryAxis.java:399)
at javafx.scene.chart.XYChart.updateAxisRange(XYChart.java:603)
at javafx.scene.chart.XYChart.layoutChartChildren(XYChart.java:620)
at javafx.scene.chart.Chart$1.layoutChildren(Chart.java:84)
at javafx.scene.Parent.layout(Parent.java:1018)
解决方法:
这对我来说很好.我测试了以下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);
}
}
如果没有看到你的FXML文件(特别是你正在使用的轴),你很难说出为什么会得到ClassCastException.但是,从堆栈跟踪中,您似乎使用的是CategoryAxis,它与LineChart< Number,Number>不兼容.
通常,您可以将两种数据类型(一个用于x,一个用于y)声明为所需的任何类型.既然你已经宣布了
@FXML
private LineChart<Number, Number> testChart ;
x变量的类型和y变量的类型都是Number.
参考Javadocs for LineChart,LineChart< X,Y>需要Axis< X>对于x轴和轴< Y>对于y轴.所以你需要一个Axis< Number>对于每个轴. CategoryAxis是Axis< String> (再次参考Javadocs),因此它不能用作折线图的轴:轴的数据类型与图表的数据类型不兼容.
如果您在Java中尝试了以下内容:
LineChart<Number, Number> testChart ;
testChart = new LineChart<>(new CategoryAxis(), new NumberAxis());
你会得到一个编译错误.由于您(可能)在FXML中初始化轴,并且FXML没有类型检查,因此您在运行时获得ClassCastException.
有助于您的代码的一件事是使用正确类型的系列:
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(new XYChart.Data(“1”,23));会产生编译错误,而不是运行时错误.)由于你在FXML中创建轴,你仍然没有类型检查那些,但我认为错误的原因(或许)会变得更清楚.
修复是使用NumberAxis,如上例所示,而不是您的CategoryAxis.如果您真的想要将CategoryAxis用于x轴,则x值必须是字符串,因此您需要将LineChart声明为LineChart< String,Number>.类似地,您可以使Series a Series< String,Number>.
内容总结
以上是互联网集市为您收集整理的JavaFX LineChart – 由于Axis的类型而导致ClassCastException全部内容,希望文章能够帮你解决JavaFX LineChart – 由于Axis的类型而导致ClassCastException所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。