Как правильно делать членов FXML в Java 9 или 10? - PullRequest
0 голосов
/ 28 июня 2018

После обновления до Java 10 (из 8) я получаю следующие ошибки:

InaccessibleObjectException: Unable to make field private javafx.scene.control.Button tech.flexpoint.dashman.controllers.configurator.RegistrationController.registerButton accessible: module tech.flexpoint.dashman does not "opens tech.flexpoint.dashman.controllers.configurator" to module javafx.fxml

Значит ли это, что я должен сделать их публичными? Делает ли это аннотацию @FXML практически бесполезной в Java 9 и 10?

1 Ответ

0 голосов
/ 28 июня 2018

Поскольку вы используете модуль, по умолчанию отражение не имеет доступа к закрытым членам ваших классов. Исключение в основном говорит вам, что нужно сделать:

module tech.flexpoint.dashman {
    ...

    // allow everyone to access classes in tech.flexpoint.dashman.controllers.configurator via reflection
    opens tech.flexpoint.dashman.controllers.configurator;
}

или

module tech.flexpoint.dashman {
    ...

    // allow only module javafx.fxml access classes in tech.flexpoint.dashman.controllers.configurator via reflection
    opens tech.flexpoint.dashman.controllers.configurator to javafx.fxml;
}

Это не делает @FXML бесполезным. По-прежнему необходимо помечать элементы, не являющиеся public, которые разрешено использовать FXMLLoader, просто необходимо явно указать, что отражение может переопределять доступ к членам. (FXMLLoader использует отражение, поэтому, по крайней мере, модулю javafx.fxml необходим такой доступ для инъекции.)

В зависимости от содержимого вашего пакета может быть полезно переместить контроллер (ы) в его собственный подпакет, чтобы не разрешать отражающий доступ к неконтроллерным классам.

...