2016-03-29 4 views
5

Ich habe eine FXML-Datei, die eine JavaFX-Benutzerschnittstelle definiert. Innerhalb der FXML Datei, habe ich folgende:JavaFX-Bindung schlägt mit "Kann nicht an nicht typisiertes Objekt binden" fehl.

... 
<Checkbox fx:id="myCheckbox" ... /> 
<Spinner disable="${myCheckbox.selected}" ... /> 
... 

Wenn ich versuche, meine FXML Datei mit dem folgenden Code zu laden, erhalte ich ein javafx.fxml.LoadException mit der Nachricht

nicht auf nicht typisierte Objekt binden kann.

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 
} 

Wer weiß, wie die FXML ändern meine Spinner zu deaktivieren, wenn das Kontrollkästchen aktiviert ist? Ich weiß, wie man das im Code macht, aber ich möchte mehr über die FXML-Syntax erfahren. Ich sollte auch hinzufügen, dass alles, wenn ich die versuchte Eigenschaftsbindung von der FXML entferne, wie erwartet geladen wird. Vielen Dank.

EDIT

Aufgrund des Kommentars von @Groostav sagen, dass es etwas in dem ... Teil des Codes sein muss, kam ich mit einem minimalen, reproduzierbaren Beispiel auf. In meinem Beispiel gibt es zwei Dateien, die ich hier komplett kopieren werde.

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> 

Wenn ich die Hauptmethode laufen lasse, erhalte ich die folgende Ausgabe:

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 

Wenn ich dieentferneaus der FXML-Datei wird alles wie erwartet geladen. Außerdem bin ich in der Lage, die Eigenschaften im Code zu binden. Warum funktioniert das nicht und wie kann ich die FXML modifizieren, um dies zu unterstützen? Ich verwende Windows 7 Enterprise SP1 x64 mit Java SE JDK 8u92 x64.

+0

ich was falsch bin nicht sicher, ich habe arbeiten fast identischen Code bekam, ist das Problem nicht mit dem FXML ist Sie auf dem Laufenden, aber etwas in einem der ' ... 's – Groostav

+0

@Groostav Ich habe ein minimales Beispiel hinzugefügt, das das Problem in meiner Umgebung reproduziert. Funktioniert mein vollständiges Beispiel für Sie? Wenn ja, welches OS/JDK benutzen Sie? –

Antwort

0

Es scheint, dass Sie nicht die deaktivierte Eigenschaft auf dem Spinner mithilfe von FXML auf diese Weise festlegen können. Es funktioniert gut in TextFields. Es könnte sich um einen Fehler handeln. Ich vermute, dass es etwas damit zu tun hat, dass der Loader einen Body für das Spinner-Tag erwartet, das die ValueFactory definiert. Daher wird der Spinner nicht korrekt definiert, wenn der CheckBox-Status mit der Eigenschaft disable verknüpft wird.

die folgende Abhilfe könnte helfen:

<?xml version="1.0" encoding="UTF-8"?> 
<?language javascript?> 
<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.util.* ?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.* ?> 
<?import javafx.scene.layout.* ?> 
<?import javafx.scene.control.SpinnerValueFactory.IntegerSpinnerValueFactory?> 

<HBox xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" 
     alignment="BASELINE_LEFT" spacing="15"> 
    <fx:script> 
    function handleCheckBoxAction(event) { 
     mySpinner.disable = (! mySpinner.disabled); 
    } 
    </fx:script> 
    <children> 
    <CheckBox fx:id="myCheckbox" text="Disable?" mnemonicParsing="false" onAction="handleCheckBoxAction(event);" /> 
    <Spinner fx:id="mySpinner"> 
     <valueFactory> 
     <SpinnerValueFactory.IntegerSpinnerValueFactory min="0" max="10"/> 
     </valueFactory> 
    </Spinner> 
    </children> 
</HBox> 
Verwandte Themen