我有两个软件包,一个用于对象,另一个用于创建GUI。我正在尝试在Javafx中创建TableView
,并且必须使用PropertyValuesFactory<>(property)
来获取对象的值。因此,我有一个错误,如果我将人和GUI课放在同一包中,一切都会好起来的,但是当将人类班放入对象软件包时,一切都会变得不好,我会遇到此错误:
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
中的指令允许,否则可防止模块反射访问其他模块。
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
。PropertyValueFactory
更适合当Lambdas不是一件事情时的便利。在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,它会给我带来错误。
这与属性valueFactory如何使用getter函数找到值有关。您可以阅读有关此内容的更多信息:https://visdup.blogspot.com/2019/04/javafx-propertyvaluefactory-is-not-able.html
是的,控制器和班级人员需要在一个软件包中