JavaFX LineChart添加数据时出现NoSuchMethodError问题求助
JavaFX LineChart 添加数据触发 NoSuchMethodError 问题
问题现象
创建LineChart时未添加数据程序可正常运行,一旦添加数据就抛出错误,核心异常信息:
Caused by: java.lang.NoSuchMethodError: 'javafx.beans.value.ObservableValue javafx.beans.property.ObjectProperty.flatMap(java.util.function.Function)'
相关代码
Java控制器代码
package GUI; import javafx.fxml.FXML; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; public class GUIStockLinegraphController { @FXML private LineChart<Number, Number> chart; @FXML private NumberAxis xAxis; @FXML private NumberAxis yAxis; public void initialize(){ XYChart.Series<Number, Number> series = new XYChart.Series<>(); series.setName("Test Chart"); series.getData().add(new XYChart.Data<>(1, 2)); // 添加此行后触发错误 chart.getData().add(series); } }
FXML布局代码
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.chart.LineChart?> <?import javafx.scene.chart.NumberAxis?> <LineChart fx:id="chart" xmlns="http://javafx.com/fxml/11" xmlns:fx="http://javafx.com/fxml/1" fx:controller="GUI.GUIStockLinegraphController" layoutX="5.0" layoutY="10.0" prefHeight="233.0" prefWidth="870.0" > <xAxis> <NumberAxis side="BOTTOM" fx:id="xAxis"/> </xAxis> <yAxis> <NumberAxis side="LEFT" fx:id="yAxis"/> </yAxis> </LineChart>
完整堆栈信息
Exception in Application start method java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at javafx.graphics@22/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464) at javafx.graphics@22/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1135) Caused by: java.lang.RuntimeException: Exception in Application start method at javafx.graphics@22/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893) at javafx.graphics@22/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: javafx.fxml.LoadException: /F:/chartsDemo/target/classes/GUI/Stock-linegraph.fxml /F:/chartsDemo/target/classes/GUI/Stock-view.fxml:59 at javafx.fxml@22/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2727) at javafx.fxml@22/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2697) at javafx.fxml@22/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2568) at javafx.fxml@22/javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1160) at javafx.fxml@22/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:759) at javafx.fxml@22/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2858) at javafx.fxml@22/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2654) at javafx.fxml@22/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2568) at javafx.fxml@22/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2536) at com.example.demo/GUI.GUIMainApplication.start(GUIMainApplication.java:41) at javafx.graphics@22/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839) at javafx.graphics@22/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483) at javafx.graphics@22/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456) at java.base/java.security.AccessController.doPrivileged(AccessController.java:400) at javafx.graphics@22/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455) at javafx.graphics@22/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at javafx.graphics@22/com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at javafx.graphics@22/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184) ... 1 more Caused by: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at com.sun.javafx.reflect.Trampoline.invoke(MethodUtil.java:76) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(MethodUtil.java:273) at javafx.fxml@22/com.sun.javafx.fxml.MethodHelper.invoke(MethodHelper.java:84) at javafx.fxml@22/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2693) ... 17 more Caused by: java.lang.NoSuchMethodError: 'javafx.beans.value.ObservableValue javafx.beans.property.ObjectProperty.flatMap(java.util.function.Function)' at javafx.controls@22/javafx.scene.chart.XYChart$Data$4.invalidated(XYChart.java:1371) at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:112) at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147) at javafx.controls@22/javafx.scene.chart.XYChart$Data.setNode(XYChart.java:1406) at javafx.controls@22/javafx.scene.chart.LineChart.createSymbol(LineChart.java:531) at javafx.controls@22/javafx.scene.chart.LineChart.seriesAdded(LineChart.java:424) at javafx.controls@22/javafx.scene.chart.XYChart.lambda$new$1(XYChart.java:164) at javafx.base/com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:164) at javafx.base/com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:73) at javafx.base/javafx.collections.ObservableListBase.fireChange(ObservableListBase.java:233) at javafx.base/javafx.collections.ListChangeBuilder.commit(ListChangeBuilder.java:482) at javafx.base/javafx.collections.ListChangeBuilder.endChange(ListChangeBuilder.java:541) at javafx.base/javafx.collections.ObservableListBase.endChange(ObservableListBase.java:205) at javafx.base/javafx.collections.ModifiableObservableListBase.add(ModifiableObservableListBase.java:155) at java.base/java.util.AbstractList.add(AbstractList.java:113) at com.example.demo/GUI.GUIStockLinegraphController.initialize(GUIStockLinegraphController.java:24) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ... 24 more Exception running application GUI.GUIMainApplication
当前Maven依赖配置
<dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>22</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-fxml</artifactId> <version>22</version> </dependency> <dependency> <groupId>org.controlsfx</groupId> <artifactId>controlsfx</artifactId> <version>11.1.2</version> </dependency>
解决方案
统一JavaFX版本:确保所有JavaFX相关依赖(包括隐式引入的
javafx.base、javafx.graphics等)版本完全一致,避免版本冲突。可通过Maven命令排查依赖树:mvn dependency:tree若发现旧版JavaFX依赖,在对应依赖中添加排除规则。
更新ControlsFX版本:ControlsFX 11.1.2仅适配JavaFX 11,与JavaFX 22不兼容。更换为适配JavaFX 22的版本,例如:
<dependency> <groupId>org.controlsfx</groupId> <artifactId>controlsfx</artifactId> <version>11.2.0</version> </dependency>检查模块化配置:如果是模块化项目,确保
module-info.java正确声明依赖:module com.example.demo { requires javafx.controls; requires javafx.fxml; requires org.controlsfx.controls; opens GUI to javafx.fxml; exports GUI; }确认运行时环境:确保运行时使用的JavaFX SDK版本与编译依赖版本一致,避免IDE或构建工具加载了系统中其他版本的JavaFX。
内容的提问来源于stack exchange,提问作者Dog
相关产品推荐
相关产品推荐

