java - 使用 FXML 中的数据绑定(bind)表达式填充 tableView 中的项目?

标签 java javafx

如何使用来自 Controller 的引用模型数据的表达式填充 TableView 中的项目?我想在 FXML 文件中完成。

最佳答案

您只需将模型放入 FXMLLoader 即可完成这项工作加载 FXML 之前的命名空间。它涉及 Controller 、模型和 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 注入(inject)到 Controller 中(我认为这是一个疏忽...)。所以简单地做

public class Controller {
    @FXML
    private Model model ;

    // ...
}

不会让您访问 Controller 中的模型。如果你需要这个,你可能会这样做,那么你需要手动设置它:

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 中定义的方法.

如果您需要访问 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 文件的属性(因为已经设置了 Controller )。

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

关于java - 使用 FXML 中的数据绑定(bind)表达式填充 tableView 中的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29209072/

相关文章:

JavaFx ObservableSet 适配器

java - MiGLayout 大小调整在 JavaFX 中无法正常工作

JavaFX TableColumn 文本换行

java - 为什么 Hibernate 会忽略我的 persistence.xml 中的 JPA2 标准化属性?

java - 请求 int 输入时出现奇怪的返回值

JavaFX 自动完成组合框下拉大小

css - 无法在 Gluon 元素上加载皮肤错误

java - Android:在 ListView header 中设置文本

java - Android Studio 找不到或加载 "Scratch"文件的主类

java - 使用着色器时纹理不渲染?