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

我已经成功设置了可以轻松设置特定属性的对象,例如hostNametypeNamemoto,例如但是,在FXML中,您具有列表-就像ObservableList中保存的JavaFX UI元素的子节点一样。我在FXML中使用featuresObservableList)属性时遇到问题。给出错误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/

10-10 09:54