使用 @DefaultProperty 时“元素未定义默认属性”

2024-02-24

我正在尝试创建一个自定义 JavaFX 元素以在 FXML 中使用,但是当FXMLLoader尝试解析它,它抛出一个异常,指出:

javafx.fxml.LoadException:元素未定义默认属性。

然而,经过一些研究后,我相信我正确地定义了默认属性。

如果我包括nestedCellValueFactory标签,一切都按预期进行。

Java

@DefaultProperty("nestedCellValueFactory")
public class NestablePropertyValueFactory<S, T> extends PropertyValueFactory<S, T> {

    private ObjectProperty<PropertyValueFactory<?, ?>> nestedCellValueFactory;

    public NestablePropertyValueFactory(
            @NamedArg("property") String property,
            @NamedArg("nestedCellValueFactory") PropertyValueFactory<?, ?> nestedCellValueFactory) {
        super(property);
        this.nestedCellValueFactory = new SimpleObjectProperty<>(this, "nestedCellValueFactory", nestedCellValueFactory);
    }

    public final ObjectProperty<PropertyValueFactory<?, ?>> nestedCellValueFactoryProperty() {
        return nestedCellValueFactory;
    }

    public final PropertyValueFactory<?, ?> getNestedCellValueFactory() {
        return nestedCellValueFactoryProperty().get();
    }

    public final void setNestedCellValueFactory(PropertyValueFactory<?, ?> nestedCellValueFactory) {
        nestedCellValueFactoryProperty().set(nestedCellValueFactory);
    }

}

FXML

<NestablePropertyValueFactory property="outer">
    <NestablePropertyValueFactory property="inner">
        <PropertyValueFactory property="property"/>
    </NestablePropertyValueFactory>
</NestablePropertyValueFactory>

经过一些调试后,我对错误有了可能的解释,但遗憾的是没有解决方案。

如果你没有运行<nestedCellValueFactory>标签,正如您已经报告的那样,您将收到此异常:

Caused by: javafx.fxml.LoadException: Element does not define a default property.
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597)
at javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103)
at javafx.fxml.FXMLLoader$Element.set(FXMLLoader.java:180)
at javafx.fxml.FXMLLoader$ValueElement.processEndElement(FXMLLoader.java:790)
at javafx.fxml.FXMLLoader.processEndElement(FXMLLoader.java:2823)

所以去FXMLLoader跟踪异常的来源你会发现:

  • 790 号线:parent.set(value);, where parent是一个实例FXMLLoader$InstanceDeclarationElement, 与类型<your.package.name>. NestablePropertyValueFactory, and value is a PropertyValueFactory object.

  • 第 177-183 行:

    public void set(Object value) throws LoadException {
        ...  
        Class<?> type = this.value.getClass();
        DefaultProperty defaultProperty = type.getAnnotation(DefaultProperty.class);
        if (defaultProperty == null) {
            throw constructLoadException("Element does not define a default property.");
        }
    
        getProperties().put(defaultProperty.value(), value);
    }
    

人们可以预料到defaultProperty.value()应该"nestedCellValueFactory",并且值会被赋值,但是抛出的异常清楚地表明情况并非如此,所以defaultProperty应该为空。

发生的情况可以通过检查来解释Class<?> type:

 type: class com.sun.javafx.fxml.builder.ProxyBuilder

So type不是你的NestablePropertyValueFactory类,但是一个ProxyBuilder.

现在,如果你检查该类,则没有@DefaultProperty注释,因此defaultProperty为 null 并且抛出异常。

该代理创建于javafx.fxml.JavaFXBuilderFactory::getBuilder,基于真实类型:

    if (scanForConstructorAnnotations(type)) {
        builder = new ProxyBuilder(type);
    }

但它返回ProxyBuilder相反,在这个过程中DefaultProperty注释丢失。

代理构建器似乎适用于带有注释的构造函数的类@NamedArg, but not为了@DefaultProperty注解。

虽然这可能是您的班级的情况,但应该有比简短的异常消息更好的解释。

无论如何,由于当您添加标签并删除默认注释时构建器工作正常,我只会考虑删除@DefaultProperty.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 @DefaultProperty 时“元素未定义默认属性” 的相关文章

随机推荐

  • 如何以编程方式确定当前类的Java字节码版本? [复制]

    这个问题在这里已经有答案了 我遇到的情况是 部署平台是 Java 5 并且开发是在 Java 6 下使用 Eclipse 进行的 我们建立了一个在开始处理给定项目时创建新工作区的过程 因此 所需步骤之一是将编译器级别设置为 Java 5 这
  • 在 AWS Lambda Layers 中找到等效的环境变量?

    我正在 AWS 上编写一个无服务器应用程序 我已将该应用程序分解为许多 Clo udFormation 堆栈 我正在使用 CDK Python 中 创建 CF 堆栈来部署应用程序 当然 我的 lambda 函数的核心要求是能够记录事件 为了
  • 如何获取 ScrollController 的完整大小

    我已将 ScrollController 附加到 SliverAppBar SliverList 的 CustomScrollView 在默认情况下 我会使用reverse true和animateTo 0 0 将滚动移动到添加的最后一个元
  • 没有为“listen ... ssl”指令定义“ssl_certificate”

    我正在尝试为我的网站配置 nginx 服务器 我正在使用以下代码来配置我的服务器 如果我为 www fastenglishacademy fr 443 服务器块添加 default server 它就会起作用 但在这种情况下 我的所有子域也
  • Firebase webpack+babel 功能未部署

    是否可以使 firebase 函数与 webpack 和 babel 一起使用 我们需要在服务器端重用现有的 ES6 类 但我们无法编辑这些类 因此我们需要转译它们以使其在 Node 中工作 花了两天时间学习相关教程 但我遇到了一个问题 即
  • 如何防止用户在iOS上截取应用程序的屏幕截图?

    我想防止用户对我的应用程序进行屏幕截图 并在最近的项目上隐藏其内容 你知道相当于Android的吗FLAG SECURE特征 https developer android com reference android view Window
  • R:创建一个函数来识别任意百分位数

    我正在使用 R 编程语言 我有以下数据集 library dplyr var1 rnorm 10000 100 100 var2 rnorm 10000 100 100 var3 rnorm 10000 100 100 var4 rnorm
  • Crystal 报表中的动态列

    我需要创建动态报告 如果在数据库中添加列 则该列应该自动反映在水晶报告中 我想知道水晶报告中是否可以使用动态列 如果是的话 如何实现 据我所知 通过在数据库中添加一列 您无法通过数据表在水晶报告上获取它 但您可以通过存储过程获取它 但您必须
  • `int` 是原子类型吗?

    Quoting gnu https www gnu org software libc manual html node Atomic Types html 实际上 您可以假设 int 是原子的 您还可以假设指针类型是原子的 非常方便 这两
  • 如何将 python 集合转换为 numpy 数组?

    我在 python 中使用集合操作来执行两个 numpy 数组之间的对称差异 然而 结果是一个集合 我需要将其转换回 numpy 数组才能继续 有没有办法做到这一点 这是我尝试过的 a numpy array 1 2 3 4 5 6 b n
  • .NET 中的 BODMAS 原理

    今天我发现 NET 框架在进行计算时遵循 BODMAS 操作顺序 即按以下顺序进行计算 Brackets Orders Division 乘法 Addition 减法 但是我四处搜索 找不到任何文档来证实 NET确实遵循这个原则 哪里有这样
  • 对广播接收器进行单元测试?

    这是我项目中的一个 BroadcastReceiver 我正在对其进行单元测试 当用户拨打电话时 它会获取电话号码 并设置启动新活动的意图 并传入电话号码 public class OutgoingCallReceiver extends
  • sonar-maven-plugin:无法设置sonar.sources src / main / resources

    我的 maven sonar 设置有问题 我需要将所有项目文件包含在src 主 java and src 主 资源这样 SonarQube 将显示我所有文件的结果 但排除其中的一些文件src main resources static 文件
  • 我如何理解 rbind 的警告?

    如果我有两个具有相同列名的 data frame 我可以使用 rbind 来创建单个数据框 但是 如果我有一个是一个因子 另一个是一个整数 我会收到如下警告 警告消息 在 lt factor tmp ri 值 c 1L 1L 0L 0L 0
  • Eclipse、Android 插件、安装新软件只是显示“待处理”

    我正在尝试按照此处的说明安装适用于 Eclipse 的 Android 插件 32 位 Windows 7 Eclipse Java Indigo 版本 迈克 普拉特 http www mikeplate com 2009 10 27 ge
  • 如何将数据随机分成三个相等大小?

    我有一个包含来自三个不同项目的 9558 行的数据集 我想将这个数据集随机分成三个相等的组 并为每个组分配一个唯一的 ID 以便Project1 Project 2 Project3变成Project1 Project2 and Proje
  • postgresql:将 bytea 转换为 bigint

    我必须将查询的 bytea 条目转换为 bigint 这怎么可能做到呢 更多信息 我有一个休眠存储库 如下所示 Query value update Sample Table set other id 1 where id 2 native
  • r 中字符变量名称的循环

    我有一个变量列表 例如 a1 a2 a3 然后我想对这些变量进行循环 例如赋值 我尝试了粘贴 它只给出了像 a1 这样的字符 这不是我真正想要的 谁能提供解决方案吗 我们可以用mget获取 a 中的值list lst lt mget pas
  • 将 csv 转换为 JSON 树结构?

    我读了这些问题 csv数据到d3中的嵌套json树 https stackoverflow com questions 19043561 csv data to nested json tree in d3 在python中从csv列表创建
  • 使用 @DefaultProperty 时“元素未定义默认属性”

    我正在尝试创建一个自定义 JavaFX 元素以在 FXML 中使用 但是当FXMLLoader尝试解析它 它抛出一个异常 指出 javafx fxml LoadException 元素未定义默认属性 然而 经过一些研究后 我相信我正确地定义