gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:10:59 27 4
gpt4 key购买 nike

我有两个包,一个用于对象,另一个用于创建 GUI。我正在尝试创建一个 TableView在 JavaFX 中,我必须使用 PropertyValuesFactory<>(property)来获取对象的值。所以我有一个错误,如果我将 Person 和 GUI 类放在同一个包中,一切都会正常工作,但是当将 Person 类放入对象包中时,一切都会变坏,并且出现此错误:

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 中的指令给予许可。

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

Deploying an Application as a Module

If the referenced class is in a named module, then it must be reflectively accessible to the javafx.base module. A class is reflectively accessible if the module opens the containing package to at least the javafx.base module. Otherwise the call(TableColumn.CellDataFeatures) method will log a warning and return null.

For example, if the Person class is in the com.foo package in the foo.app module, the module-info.java might look like this:

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

Alternatively, a class is reflectively accessible if the module exports the containing package unconditionally


另一种选择是放弃PropertyValueFactory并使用自定义Callback。当 lambda 还没有出现时,PropertyValueFactory 更加方便。在 lambda 之前,如果想要使用自定义回调,则必须每次都创建一个匿名类,这很冗长。然而,由于 lambda,人们可以这样做:

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

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

关于JavaFX PropertyValueFactory 无法从位于不同包中的类接收属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com