I have an FXML file defining a JavaFX user interface. Inside the FXML file, I have the following:
... <Checkbox fx:id="myCheckbox" ... /> <Spinner disable="${myCheckbox.selected}" ... /> ...
When I try to load an FXML file with the following code, I get javafx.fxml.LoadException with a message
Cannot associate with untyped object.
final Class<?> controllerClass = ...; final FXMLLoader fxmlLoader = new FXMLLoader(); final String fxmlPath = controllerClass.getSimpleName() + ".fxml"; try (final InputStream fxmlStream = controllerClass.getResourceAsStream(fxmlPath)) { fxmlLoader.load(fxmlStream); final Object controller = fxmlLoader.<Object>getController(); return controller }
Does anyone know how to change FXML to disable my counter when the checkbox is checked? I know how to do this in code, but I want to learn more about FXML syntax. I should also add that when I remove the attempt to bind properties to FXML, everything loads as expected. Thanks.
EDIT
Due to a comment from @Groostav saying that it should be something in the code part ... I came up with a minimal, reproducible example. In my example, there are two files that I will copy entirely here.
Main.java:
package test; import java.io.InputStream; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { public static void main(final String[] args) { launch(args); } @Override public void start(Stage window) throws Exception { final FXMLLoader fxmlLoader = new FXMLLoader(); final String fxmlPath = "Example.fxml"; final Parent root; try (final InputStream fxmlStream = getClass().getResourceAsStream(fxmlPath)) { root = (Parent)fxmlLoader.load(fxmlStream); } final Scene scene = new Scene(root); window.setScene(scene); window.show(); } }
Example.fxml:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.CheckBox?> <?import javafx.scene.control.Spinner?> <?import javafx.scene.layout.HBox?> <HBox xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" alignment="BASELINE_LEFT" spacing="15"> <children> <CheckBox fx:id="myCheckbox" text="Disable?" mnemonicParsing="false" /> <Spinner disable="${myCheckbox.selected}" /> </children> </HBox>
When I run the main method, I get the following output:
Exception in Application start method java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) Caused by: java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182) at java.lang.Thread.run(Thread.java:745) Caused by: javafx.fxml.LoadException: Cannot bind to untyped object. unknown path:12 at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597) at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103) at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:299) at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:235) at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:749) at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707) at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527) at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425) at test.Main.start(Main.java:22) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326) at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) ... 1 more Exception running application test.Main
If I remove disable="${myCheckbox.selected}" from the FXML file, everything will load as expected. In addition, I can bind properties in code. Why does this not work, and how can I change FXML to support this? I am running on Windows 7 Enterprise SP1 x64 using Java SE JDK 8u92 x64.