使用FXML中的数据绑定表达式填充tableView中的项目?

时间:2015-03-23 11:26:51

标签: java javafx

如何使用表达式引用控制器中的模型数据来填充tableview中的项目?我想在FXML文件中做到这一点。

1 个答案:

答案 0 :(得分:3)

在加载FXML之前,您可以通过将模型放入FXMLLoader命名空间来完成此工作。它涉及控制器,型号和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();

在此版本中,您必须从FXML文件中删除<fx:controller>属性(因为已经设置了控制器)。

考虑到使其工作所需的所有复杂布线,最好只在控制器的初始化方法中设置表格项目。