就像在该线程FXML: Alternate Uses中一样,我正在构建一个使用FXML将对象直接加载到内存中的应用程序。
我已经成功设置了可以轻松设置特定属性的对象,例如hostName
,typeName
,moto
,例如但是,在FXML中,您具有列表-就像ObservableList
中保存的JavaFX UI元素的子节点一样。我在FXML中使用features
(ObservableList
)属性时遇到问题。给出错误UnsupportedOperationException: cannot determine type for property
。如果它可以为BorderPane
之类的其他对象提供支持,为什么它不能向列表中添加元素。
最佳答案
因为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
结合使用。关于java - FXML,替代用法:使用ObservableList <>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51457287/