繁体   English   中英

JavaFX PropertyValueFactory 无法从位于不同包中的 class 接收属性

[英]JavaFX PropertyValueFactory unable to receive property from a class located in different packages

我有两个包,一个用于对象,另一个用于创建 GUI。 我正在尝试在 JavaFX 中创建一个TableView ,我必须使用PropertyValuesFactory<>(property)来获取 object 的值。 So I have a bug where if I put the Person and GUI class in the same package everything would work for fine, but when the Person class is put in the objects package everything goes bad and I get this error:

WARNING: Can not retrieve property 'name' in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@6771b7fb with provided class type: class uni.rest.objects.Person
    java.lang.RuntimeException: java.lang.IllegalAccessException: module javafx.base cannot access class uni.rest.objects.Person (in module main) because module main does not open uni.rest.objects to javafx.base

这也是发生错误的代码行:

person_column.setCellValueFactory(new PropertyValueFactory<>("name"));

所以我认为可能必须更改属性值位置......我将不胜感激。

PropertyValueFactory类使用反射来访问模型类的属性。 Java 9 中添加的模块系统增加了更大的封装,以防止模块反射性地访问其他模块,除非获得module-info.java的指令的module-info.java

PropertyValueFactory文档提到了将应用程序部署为模块时需要执行的操作:

将应用程序部署为模块

如果引用的类在命名模块中,那么它必须可以被javafx.base模块反射访问。 如果模块包含的包至少打开javafx.base模块,则该类是可反射访问的。 否则call(TableColumn.CellDataFeatures)方法将记录警告并返回null

例如,如果Person类位于foo.app模块的com.foo包中,则module-info.java可能如下所示:

 module foo.app { opens com.foo to javafx.base; }

或者,如果模块无条件导出包含的包,则类可以反射访问


另一种选择是放弃PropertyValueFactory并使用自定义Callback 当 lambda 不是一个东西时, PropertyValueFactory更方便; 在 lambdas 之前,如果想使用自定义Callback ,则必须每次都创建一个冗长的匿名类。 然而,由于 lambdas,人们可以这样做:

person_column.setCellValueFactory(features -> features.getValue().nameProperty());

显然,如果模型公开 JavaFX 属性,则效果最佳。 自定义Callback的优点包括避免反射和类型安全。

我有一个类似的问题,它是 getter 函数中的大写。 我试图用这个访问它

productIdColumn.setCellValueFactory(new PropertyValueFactory<Product, Integer>("id"));

这有效:

public int getId(){
    return this.id;
}

但是如果我有 GetId 或 getid 它会给我错误。

这与 PropertyValueFactory 如何使用 getter 函数查找值有关。 您可以在以下位置阅读更多关于为什么会这样的信息: https : //visdup.blogspot.com/2019/04/javafx-propertyvaluefactory-is-not-able.html

是的,Controller 和 Class 人需要在一个 package

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM