【问题标题】:JavaFx: fxmlLoader.load returns Parent?JavaFx:fxmlLoader.load 返回父级?
【发布时间】:2015-06-04 17:26:33
【问题描述】:

我在 fxml 文件的根级别有 ScrollPane,我有以下代码:

import javafx.scene.Parent;
...
parent = (Parent)fxmlLoader.load(getFxmlStream("my.fxml"));
if (parent.getClass().isAssignableFrom(Parent.class)){
    System.out.println("THIS IS PARENT");
}else{
    System.out.println("THIS IS NOT PARENT");//THIS WILL BE PRINTEED
}

为什么加载函数返回的内容不能从 Parent 类中赋值?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    来自Javadocs for isAssignableFrom:

    确定此 Class 对象表示的类或接口是否 要么是相同的,要么是超类或超接口, 由指定的 Class 参数表示的类或接口。

    因此,您正在测试您从 FXML 加载器获得的对象的运行时类型是否等于Parent 的超类。如果它是Parent 的严格子类(VBox、BorderPane 等),那么这将是false。

    如果你想测试你拥有的值是否是某种Parent,通常的方法是使用instanceof:

    if (parent instanceof Parent)){
        System.out.println("THIS IS PARENT");
    }else{
        System.out.println("THIS IS NOT PARENT");//THIS WILL BE PRINTEED
    }
    

    如果你想使用getClass() 和isAssignableFrom(),那你就搞错了:

    if (Parent.class.isAssignableFrom(parent.getClass())){
        System.out.println("THIS IS PARENT");
    }else{
        System.out.println("THIS IS NOT PARENT");//THIS WILL BE PRINTEED
    }
    

    尽管我还是推荐标准的instanceof 方法。

    还请注意,您几乎可以使用 FXML 加载任何对象,因此当然不能保证您得到的是 Parent 的子类。

    【讨论】:

    • 我的错误是 ScrollPane 是子类(ScrollPane 扩展了 Parent),但我检查了 ScrollPane 是否是超类(Parent 扩展了 ScrollPane)?
    • 是的,没错。 S.class.isAssignableFrom(T.class) 为真当且仅当 T t = ... ; S obj = t ; 将编译。
    猜你喜欢
    • 2010-10-01
    • 2016-12-22
    • 2020-02-11
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多