FXML,替代用法:使用ObservableList <>

时间:2018-07-21 15:05:02

标签: java fxml

就像在该线程FXML: Alternate Uses中一样,我正在构建一个使用FXML将对象直接加载到内存中的应用程序。

我已经成功设置了对象,可以轻松设置诸如hostNametypeNamemoto之类的特定属性,例如但是,在FXML中,您具有列表-就像ObservableList中保存的JavaFX UI元素的子节点一样。我在FXML中使用featuresObservableList)属性时遇到麻烦。它给出一个错误UnsupportedOperationException: cannot determine type for property。如果它可以为其他对象,例如BorderPane,为什么不能将元素添加到列表中。

1 个答案:

答案 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