Javafx Property ValueFactory无法从位于不同软件包中的类中接收属性



我有两个软件包,一个用于对象,另一个用于创建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并使用自定义CallbackPropertyValueFactory更适合当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

是的,控制器和班级人员需要在一个软件包中

最新更新