是否可以在fxml中创建与javafx.beans.property.ListProperty属性的绑定?

时间:2016-06-24 07:05:54

标签: javafx fxml fxmlloader

我试图将ui-elements之间的所有关系(即“如果textfield为空时禁用按钮”)与fxml分开。
这在大多数情况下都可以正常工作,但似乎无法绑定到 java.util.List 派生类。
它始终以 com.sun.javafx.fxml.expression.Expression.get()

引起的 java.lang.NumberFormatException 结尾
public static <T> T get(Object namespace, String key) {

...
    if (namespace instanceof List<?>) {
        List<Object> list = (List<Object>)namespace;
        **value = list.get(Integer.parseInt(key));**
    }
...

其中key是我尝试绑定的属性名称(如果绑定到“myListProperty.empty”,则为“empty”)。 FXMLLoader尝试获取索引“property-name”的值,而不是获取相应的属性(如果namespace-object没有实现 java.util.List ,则正确执行)。

附带的简短示例显示了如何重现行为:

主要级

package test.fxml;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class TestApp extends Application
{
    @Override
    public void start( Stage primaryStage ) throws Exception
    {
        Parent root  = FXMLLoader.load( getClass().getResource( "./Test.fxml" ) );
        Scene  scene = new Scene( root,300,250 );

        primaryStage.setTitle( "Test App" );
        primaryStage.setScene( scene );
        primaryStage.show();
    }

    public static void main( String[] args )
    {
        Application.launch( args );
    }
}

控制器级(空)

package test.fxml;

public class Controller
{
    public Controller()
    {
        super();
    }
}

FXML文件

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.beans.property.SimpleListProperty?>
<?import javafx.scene.control.TextField?>

<VBox xmlns="http://javafx.com/javafx/8.0.92"
      xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="test.fxml.Controller">

    <fx:define>
      <SimpleListProperty fx:id="myListProperty" />
    </fx:define>

    <TextField fx:id="myTextField"
               text="does not work"
               disable="${myListProperty.empty}"/>

</VBox>

摘自堆栈跟踪

Caused by: java.lang.NumberFormatException: For input string: "empty"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.sun.javafx.fxml.expression.Expression.get(Expression.java:623)
    at com.sun.javafx.fxml.expression.Expression.get(Expression.java:597)
    at com.sun.javafx.fxml.expression.Expression.get(Expression.java:597)
    at com.sun.javafx.fxml.expression.Expression.get(Expression.java:576)
    at com.sun.javafx.fxml.expression.VariableExpression.evaluate(VariableExpression.java:53)
    at com.sun.javafx.fxml.expression.ExpressionValue.getValue(ExpressionValue.java:192)
    at com.sun.javafx.binding.ExpressionHelper.addListener(ExpressionHelper.java:54)
    at javafx.beans.value.ObservableValueBase.addListener(ObservableValueBase.java:55)
    at com.sun.javafx.fxml.expression.ExpressionValue.addListener(ExpressionValue.java:201)
    at javafx.beans.binding.BooleanBinding.bind(BooleanBinding.java:107)
    at javafx.beans.property.BooleanPropertyBase$1.<init>(BooleanPropertyBase.java:169)
    at javafx.beans.property.BooleanPropertyBase.bind(BooleanPropertyBase.java:166)
    at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(FXMLLoader.java:319)
    at javafx.fxml.FXMLLoader$Element.processInstancePropertyAttributes(FXMLLoader.java:235)
    at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:767)
    at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2532)   

我的问题是:
1.有人知道这是否是fxml中的错误?
2.如果没有,有人可以向我解释 java.util.List 的特殊处理吗? 3.是否有可能满足“按照列表大小启用/禁用ui组件或仅通过fxml启用列表状态 ”的要求?

非常感谢您的帮助。

0 个答案:

没有答案