就像在该线程FXML: Alternate Uses中一样,我正在构建一个使用FXML将对象直接加载到内存中的应用程序。
我已经成功设置了对象,可以轻松设置诸如hostName
,typeName
,moto
之类的特定属性,例如但是,在FXML中,您具有列表-就像ObservableList
中保存的JavaFX UI元素的子节点一样。我在FXML中使用features
(ObservableList
)属性时遇到麻烦。它给出一个错误UnsupportedOperationException: cannot determine type for property
。如果它可以为其他对象,例如BorderPane
,为什么不能将元素添加到列表中。
答案 0 :(得分:1)
因为ObservableList
没有公共的具体类型,所以必须使用FXCollections
工厂方法来获取实例。幸运的是,FXML旨在处理以下情况:通过使用fx:factory
属性。您可以在Introduction to FXML | JavaFX 10中进一步了解不同的fx:
选项。
一个例子。
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.collections.FXCollections?>
<FXCollections fx:factory="observableArrayList" xmlns="http://javafx.com/javafx/10.0.2"
xmlns:fx="http://javafx.com/fxml/1">
<!-- your children elements -->
</FXCollections>
元素的类型将是fx:factory
声明的工厂方法返回的类型。在这种情况下,一个ObservableList
(由ArrayList
支持)。
如果您使用ObservableList
字段(例如features
)定义了一个带有适当的getter的类,那么您应该可以这样做:
<YourObject>
<features>
<!-- your feature elements -->
</features>
</YourObject>
但是,我很难使它正常工作。当我尝试使用它时,仅将第一个元素添加到ObservableList
中,我也不知道为什么(也许是一个错误)。
我设法使用以下方法解决此问题:
<fx:define>
<ArrayList fx:id="tempList">
<!--- your feature elements -->
</ArrayList>
</fx:define>
<YourObject>
<features>
<fx:reference source="tempList"/>
</features>
</YourObject>
由于某些原因,我在使用DefaultProperty
注释时也遇到了问题。它一直告诉我“没有默认属性” ...但是它确实存在!
除了“替代方法”,您可以像其他任何属性一样简单地将其“设置” ObservableList
。或者,您可以(可能)结合使用FXML
注释和fx:id
。