Класс PropertyValueFactory
использует отражение для доступа к свойствам класса модели.Модульная система, добавленная в Java 9, добавляет большую инкапсуляцию, которая предотвращает рефлексивный доступ модулей к другим модулям, если только не дано разрешение директивами в module-info.java
.
В документации из PropertyValueFactory
указано, что вам нужноЧто делать, если развертывание приложения выполняется в виде модуля:
Развертывание приложения в виде модуля
Если указанный класс находится в именованном модуле, он долженбыть отражательно доступным для модуля javafx.base
.Класс является рефлексивно доступным, если модуль открывает содержащий пакет хотя бы для модуля javafx.base
.В противном случае метод call(TableColumn.CellDataFeatures)
запишет предупреждение и вернет null
.
Например, если класс Person
находится в пакете com.foo
в модуле foo.app
module-info.java
может выглядеть следующим образом:
module foo.app {
opens com.foo to javafx.base;
}
В качестве альтернативы, класс является отражательно доступным, если модуль экспортирует содержащий пакет безоговорочно
Другой вариант - отказаться от PropertyValueFactory
и использовать пользовательский Callback
.PropertyValueFactory
было больше удобством, когда лямбды не были чем-то особенным;перед лямбдами, если бы кто-то хотел использовать пользовательский Callback
, он должен был бы каждый раз создавать анонимный класс, который был бы многословным.Однако, поскольку лямбда-выражения можно сделать:
person_column.setCellValueFactory(features -> features.getValue().nameProperty());
Очевидно, что это работает лучше всего, если модель предоставляет свойство JavaFX.Преимущества пользовательского Callback
включают избегание отражения и безопасность типов.