Как я могу заполнить элементы в представлении таблицы, используя выражение, ссылающееся на данные модели с контроллера? Я хочу сделать это в файле FXML.
Вы можете просто сделать эту работу, поставив модель в пространство имен 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 (поскольку контроллер уже установлен).
Учитывая всю сложную проводку, необходимую для ее работы, вероятно, лучше просто установить элементы таблицы в методе инициализации контроллера.