有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java FXML,替代用途:使用ObservableList<>

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

我已经成功地设置了一些对象,在这些对象中可以轻松地设置特定属性,例如hostNametypeNamemoto,但是在FXML中,您有一个ObservableList中保存的JavaFXUI元素的类似列表的子节点。在FXML中使用featuresObservableList)属性时遇到问题。它给出了一个错误UnsupportedOperationException: cannot determine type for property。如果可以为其他对象(如BorderPane)添加元素,为什么它不能将元素添加到列表中


共 (1) 个答案

  1. # 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中,我不知道为什么(可能是个bug)

    我设法通过以下方式解决了这个问题:

    <fx:define>
        <ArrayList fx:id="tempList">
            <! - your feature elements  >
        </ArrayList>
    </fx:define>
    
    <YourObject>
        <features>
            <fx:reference source="tempList"/>
        </features>
    </YourObject>
    

    出于某种原因,我在使用^{}注释时也遇到了问题。它一直告诉我“没有默认属性”。。。但确实如此

    除了“变通方法”,你可以简单地让它像其他任何属性一样“设置”ObservableList。或者,您可以(可能)将FXML注释与fx:id结合使用