Заполнить элементы в tableView с помощью выражения привязки данных в FXML?

1

Как я могу заполнить элементы в представлении таблицы, используя выражение, ссылающееся на данные модели с контроллера? Я хочу сделать это в файле FXML.

Теги:
javafx

1 ответ

3

Вы можете просто сделать эту работу, поставив модель в пространство имен FXMLLoader прежде чем загружать FXML. Это связано с большим количеством проводки между контроллером, моделью и FXMLLoader.

Данный

public class Model {

    public ObservableList<SomeDataType> getTableItems() {
        // ...
    }

}

и файл FXML View.fxml с

<!-- root element: -->
<BorderPane xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.Controller">
    <TableView fx:id="table" items="${model.tableItems}">
        <!-- ... -->
    </TableView>

    <!-- ... -->
</BorderPane>

Затем вы можете сделать следующее:

Model model = new Model();
// configure model as needed...
FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);
Parent root = loader.load();
// etc

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

public class Controller {
    @FXML
    private Model model ;

    // ...
}

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

Model model = new Model();

FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);
Parent root = loader.load();

Controller controller = loader.getController();
controller.setModel(model);

с очевидным setModel(...) определенным в Controller.

Если вам нужен доступ к модели в методе initialize() контроллера, вам нужно сделать следующий шаг:

Model model = new Model();
Controller controller = new Controller();
controller.setModel(model); // or define a constructor taking the model...

FXMLLoader loader = new FXMLLoader(getClass().getResource("View.fxml"));
loader.getNamespace().put("model", model);

loader.setController(controller);

Parent root = loader.load();

В этой версии вы должны удалить атрибут <fx:controller> из файла FXML (поскольку контроллер уже установлен).

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню