[英]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.