如何从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);
}
}
很难说清楚为什么ClassCastException
看不到FXML文件(尤其是所使用的轴),这是很难的。但是,从堆栈跟踪中可以看出,您正在使用CategoryAxis
,与的类型不兼容LineChart<Number, Number>
。
通常,您可以将两种数据类型(一种用于x,一种用于y)声明为所需的任何类型。自从你宣布
@FXML
private 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(new XYChart.Data("1", 23));
会产生编译错误,而不是运行时错误。)由于您是在FXML中创建轴的,因此仍然没有对这些轴进行类型检查,但我认为错误的原因(也许)会更加清楚。
解决方法是使用NumberAxis
,如上面的示例所示,而不是您的CategoryAxis
。如果您确实想CategoryAxis
在x轴上使用a
,则x值必须为String
s,因此您需要将LineChart
as 声明为a LineChart<String, Number>
。同样,您将制作Series
一个Series<String, Number>
。
我尝试将其更改为XPath并使用以下命令://input[@id='p400_add_medium_but'] driver.findElement(by.xpath(“//input[@id='p400_add_medium_but']”)).click(); 但结果还是一样。我在IDE中回放了录制好的脚本,这工作很好。我应该提到测试必须在IE中运行(它是一个内部应用程序,IE是唯一在内部使用的
问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。
问题内容: 我正在尝试编写一种获取a的方法,以验证数字是否在点后有东西,如果有,则返回a ,如果没有则返回a 。 输出: 因此,我想要的一切都发生在method中,但没有发生在method中。这些方法似乎必须完成相同的工作。但是我做错了什么? 问题答案: 正如其他答案所指出的,此行为是因为三元表达式的两个可能结果都必须具有相同的类型。 因此,您要做的所有事情都可以使三元版本的工作方式与将强制转换为
我在应用程序部署期间进行Hibernate验证时遇到了一些问题。我有两个类,Frame和FrameReleasePlan,它们在OneToOne关系中关联。在数据库端,关系是单向的。frame_release_planss表有一个NUMERIC(19,0)类型的“frame_id”列,它是一个指向frame表“id”列的外键。当我尝试部署时,模式验证失败并出现错误: 无法生成Hibernate S
我在Tomcat中实现自己的身份验证过滤器时遇到了一些问题。当我部署项目时,我得到以下日志: 原因:java。lang.ClassCastException:类com。somename。第。sso。卡蒙达。无法将KeyDoppessAuthenticationProvider强制转换为类org。卡蒙达。bpm。发动机Rest安全授权。AuthenticationProvider(com.somen
问题内容: python 3.5的新功能之一是受此项目启发的类型提示。 键入:PEP 484 –键入提示。 我想测试它,但是它没有按预期工作。 结果是: 我期待一个错误,因为我期望布尔作为回报。我在python:3.5(docker)和local上测试了它。我是否想念一些东西以使其起作用?这种键入是否在运行时不起作用(例如python app.py)? 问题答案: 请参阅您链接到的PEP中摘要的第