【问题标题】:Populate items in tableView using data-binding expression in FXML?使用 FXML 中的数据绑定表达式填充 tableView 中的项目?
【发布时间】:2015-03-23 11:26:51
【问题描述】:

如何使用从控制器引用模型数据的表达式来填充表格视图中的项目?我想在 FXML 文件中进行。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    您可以通过在加载 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);
    

    使用Controller 中定义的明显的setModel(...) 方法。

    如果你需要在控制器的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 文件中删除 &lt;fx:controller&gt; 属性(因为控制器已经设置)。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2014-09-08
    • 2013-06-28
    • 2020-05-20
    • 2016-05-29
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多