我试图将ui-elements之间的所有关系(即“如果textfield为空时禁用按钮”)与fxml分开。
这在大多数情况下都可以正常工作,但似乎无法绑定到 java.util.List 派生类。
它始终以 com.sun.javafx.fxml.expression.Expression.get():
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启用列表状态 ”的要求?
非常感谢您的帮助。