FXML:将 TableViews 项 属性 绑定到控制器

FXML: Bind TableViews items property to controller

我在 FXML 中有一个 TableView,我想将它的项目 属性 绑定到控制器中的列表(就像在 WPF 中一样),我的FXML 代码是这样的:

<TableView fx:controller="controllers.MyController"  items="$controller.loggings">
    <columns>
        <TableColumn text="Nom">
            <cellValueFactory>
                <PropertyValueFactory property="name" />
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="Type">
            <cellValueFactory>
                <PropertyValueFactory property="type" />
            </cellValueFactory>
        </TableColumn>
    </columns>
</TableView>

我的控制器如下:

public class MyController {
    public ObservableList<Logging> loggings = FXCollections.observableArrayList();

    @FXML
    protected void initialize(){
        loggings.add(new Logging(){{
            setName("hilton");
            setType("hotel");

        }});
    }
}

出于某种原因 Exception 启动。我做错了什么?

您的 FXML 文件有误。您必须将项目分配给控制器 class 内的 TableView

FXML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.cell.PropertyValueFactory?>

<TableView xmlns:fx="http://javafx.com/fxml" fx:controller="controllers.MyController" fx:id="tableView">
    <columns>
        <TableColumn text="Nom">
            <cellValueFactory>
                <PropertyValueFactory property="name" />
            </cellValueFactory>
        </TableColumn>

        <TableColumn text="Type">
            <cellValueFactory>
                <PropertyValueFactory property="type" />
            </cellValueFactory>
        </TableColumn>
    </columns>
</TableView>

控制器:

package controllers;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;

public class MyController {
    @FXML
    private TableView<Logging> tableView;

    public ObservableList<Logging> loggings = FXCollections.observableArrayList();

    @FXML
    protected void initialize(){
        loggings.add(new Logging(){{
            setName("hilton");
            setType("hotel");

        }});

        tableView.setItems(loggings);
    }
}

您还没有声明 fx 命名空间:

<TableView xmlns:fx="http://javafx.com/fxml/1" fx:controller="controllers.MyController"  items="$controller.loggings">
    ...
</TableView>

此外,控制器 class 需要为 loggings 字段包含一个 getter:

private final ObservableList<Logging> loggings = FXCollections.observableArrayList();

public ObservableList<Logging> getLoggings() {
    return loggings;
}

注意: JavaFX 不考虑表达式绑定的字段,因此需要 getter。