Исключение возникает потому, что PropertyValueFactory
использует отражение для доступа к вызовам методов в классе вашей модели Credits
. Поскольку ваш модуль не открыт для такого доступа к модулю javafx.base
, вы получите отправленный вами IllegalAccessException
.
Это можно исправить, добавив в файл module-info.java
строку, подобную следующей:
opens org.application to javafx.base ;
Возможно, лучший подход - избегать использования PropertyValueFactory
. Этот класс был действительно разработан, потому что до Java 8 и лямбда-выражений создание CellValueFactory
просто для доступа к свойству в модельном классе было довольно громоздким. С появлением лямбда-выражения в Java 8 это уже не так, и использование лямбда-выражения вместо отражающего PropertyValueFactory
, вероятно, дает лучшую производительность и, что более важно, обеспечивает проверку во время компиляции.
Сначала (и вы должны сделать это независимо) добавьте методы доступа к свойству в ваш класс Credits
. Поскольку ваш класс в настоящее время стоит, вы создаете StringProperty
экземпляров, но нет методов для доступа к ним (только методы для доступа к их содержимому). Следовательно, ваша таблица не будет динамически обновляться, если вы позвоните, например, setTitle()
для уже отображенного Credits
экземпляра. Вам просто нужно добавить
public class Credits {
// all existing code...
public StringProperty titleProperty() {
return title ;
}
public StringProperty occupationProperty() {
return occupation ;
}
public StringProperty personProperty() {
return person ;
}
}
Теперь вы можете просто ссылаться на свойства прямо в вашем Credits
классе:
title.setCellValueFactory(cellData -> cellData.getValue().titleProperty());
и аналогично для других столбцов. Наряду с другими преимуществами (прежде всего проверка во время компиляции, что свойство действительно существует), это также устраняет необходимость рефлексивного представления вашего класса Credits
модулю javafx.base
.