Как создать несколько экземпляров контроллеров и представлений из одного класса контроллера и файла f xml - PullRequest
1 голос
/ 05 апреля 2020

В моем приложении, используя связку spring & javafx-weaver, я пытаюсь создать таблицу с раскрывающимися полями org.controlsfx.control.table.TableRowExpanderColumn.

tableUser.setItems(usersObservableList);
tableColumn1.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getDepartment().getName()));
tableColumn2.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getLogin()));
tableColumn3.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().getProfile().toStringFIO()));

TableRowExpanderColumn<User> tableExpanderColumn = new TableRowExpanderColumn<>(param -> {
    FxControllerAndView<UserEditExpanderController, GridPane> userEditExpander = getFxWeaver().load(UserEditExpanderController.class);
    GridPane nodeGridPane = userEditExpander.getView().orElse(new GridPane());
    UserEditExpanderController userEditExpanderController = userEditExpander.getController();
    userEditExpander.getController().setData(param.getValue());
    return nodeGridPane;
}

tableUser.getColumns().add(0, tableExpanderColumn);

Идет инициализация как и должно быть, но при редактировании полей я понимаю, что используется один экземпляр контроллера. То есть тот, который был инициализирован в последний раз.

снимок экрана

Как получить собственный экземпляр контроллера для каждого представления? Как многократно использовать один контроллер и представление в таблице?

Насколько я понимаю, getFxWeaver().load(UserEditExpanderController.class) загружает один и тот же экземпляр контроллера, но в то же время создает новое представление.

1 Ответ

1 голос
/ 05 апреля 2020

Вы правы в своем предположении, что каждая операция load создает новый вид и связывает его с контроллером, предоставленным фабрикой компонентов (контекст приложения Spring).

По умолчанию компоненты Spring имеют одноэлементную область, таким образом, вы всегда получаете один и тот же экземпляр контроллера.

Если я правильно понимаю вашу проблему, ее можно легко исправить, переключившись на область действия прототипа:

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class UserEditExpanderController {
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...