2016-03-29 5 views
5

मेरे पास एक जावाएफएक्स उपयोगकर्ता इंटरफेस को परिभाषित करने वाली एक FXML फ़ाइल है।जावाएफएक्स बाध्यकारी विफलता "बिना शर्त वस्तु से बंधे"।

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

जब मैं निम्नलिखित कोड के साथ मेरी FXML फ़ाइल को लोड करने की कोशिश, मैं संदेश

के साथ एक javafx.fxml.LoadException मिल untyped वस्तु के लिए बाध्य नहीं कर सकता: FXML फ़ाइल के भीतर, मैं निम्नलिखित है।

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 
} 

किसी को कैसे मेरे स्पिनर को निष्क्रिय करने के FXML संशोधित करने के लिए जब चेकबॉक्स चयनित है पता है? मुझे पता है कि कोड में इस बारे में कैसे जाना है, लेकिन एफएक्सएमएल सिंटैक्स के बारे में और जानना चाहते हैं। मुझे यह भी जोड़ना चाहिए कि जब मैं FXML से बाध्यकारी प्रयास की गई संपत्ति को हटा देता हूं, तो सब कुछ अपेक्षित रूप से लोड होता है। धन्यवाद।

संपादित

@Groostav से टिप्पणी करते हुए कहा कि यह कोड के ... हिस्से में कुछ हो जाने के कारण, मैं एक न्यूनतम, प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के साथ आया था। मेरे उदाहरण में, दो फाइलें हैं, जिन्हें मैं यहां पूरी तरह से कॉपी करूंगा।

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> 

जब मैं मुख्य विधि चलाने के लिए, मैं निम्नलिखित उत्पादन प्राप्त करें:

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 

अगर मैंहटा देता हूं FXML फ़ाइल से, सब कुछ अपेक्षित के रूप में लोड होता है। इसके अलावा, मैं कोड में गुणों को बांधने में सक्षम हूं। यह क्यों काम नहीं कर रहा है, और मैं इसका समर्थन करने के लिए FXML को कैसे संशोधित कर सकता हूं? मैं जावा एसई जेडीके 8u92 x64 का उपयोग कर विंडोज 7 एंटरप्राइज़ एसपी 1 एक्स 64 पर चल रहा हूं।

+0

मैं क्या गलत, मुझे मिल गया है लगभग समान कोड काम कर यकीन नहीं है, समस्या FXML तुम्हें तैनात है, लेकिन में से एक में कुछ के साथ नहीं है ' ... ' – Groostav

+0

@ ग्रोस्टाव मैंने एक न्यूनतम उदाहरण जोड़ा है जो मेरे पर्यावरण में समस्या को पुन: उत्पन्न करता है। क्या मेरा पूरा उदाहरण आपके लिए काम करता है? यदि हां, तो आप किस ओएस/जेडीके का उपयोग कर रहे हैं? –

उत्तर

0

ऐसा लगता है कि आप इस तरह FXML का उपयोग कर स्पिनर पर अक्षम संपत्ति सेट नहीं कर सकते हैं। यह TextFields पर ठीक काम करता है। यह एक बग हो सकता है, मुझे लगता है कि यह लोडर के साथ कुछ करना है जो स्पिनर टैग को वैल्यू फैक्ट्री को परिभाषित करने के लिए उम्मीद कर रहा है, इसलिए स्पिनर को अक्षम संपत्ति में लिंकबॉक्स स्थिति को जोड़ने का प्रयास सही तरीके से परिभाषित नहीं किया जाता है।

निम्नलिखित तरीके को मदद कर सकता है:

<?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> 
संबंधित मुद्दे