JavaFX TableView 不更新

JavaFX TableView not updating

调用 table.getItems().setAll(lst); 时 JavaFX TableView 不会更新,其中 List<Student> lst; 即使在另一个项目中这个逻辑似乎有效。

所以,我有一个带 getter 的对象 Student。

public class Student implements HasID<Integer> {
private Integer id;
private String name;
private String group;
private String email;
private String guide;


public Student(int _id, String _name, String _group, String _email, String _guide) {
    this.id = _id;
    this.name = _name;
    this.group = _group;
    this.email = _email;
    this.guide = _guide;
}

@Override
public Integer getId() {
    return this.id;
}

public String getName() {
    return this.name;
}

public String getGroup() {
    return this.group;
}

public String getEmail() {
    return this.email;
}

public String getGuide() {
    return this.guide;
}

我有 table 的 fxml。

<TableView fx:id="table" layoutX="37.0" layoutY="113.0" prefHeight="397.0" prefWidth="480.0">
    <columns>
      <TableColumn fx:id="id" prefWidth="61.0" text="ID" />
      <TableColumn fx:id="name" prefWidth="119.0" text="Name" />
        <TableColumn fx:id="group" prefWidth="78.0" text="Group" />
        <TableColumn fx:id="email" prefWidth="102.0" text="Email" />
        <TableColumn fx:id="guide" prefWidth="119.0" text="Guide" />
    </columns>
  </TableView>

最后,我有控制器的方法来填充 table。

public void testAction() {
    List<Student> lst = s.findAllListStudent();

    table.getItems().setAll(lst);

    for (Student x : lst) {
        System.out.println(x);
    }
}

控制器和方法已正确链接,因为我可以看到 println 的输出并且我可以看到 table 中的变化,但未显示任何数据。 示例(触发方法前后):

感谢任何帮助。

一个TableView

  1. 一个collection of TableColumns,并且
  2. 一个collection of items,每一项代表table中一行显示的值。

为了让一列在该列的每个单元格中显示值,该列需要一个函数将行的值映射到要在相应单元格中显示的值。具体来说,如果您有一个 TableView<S>,那么每一行的值都由一个 S 类型的对象表示。每列是一个 TableColumn<S,T>,将一行映射到要显示在该列相应单元格中的值的函数是 Callback<CellDataFeatures<S,T>, ObservableValue<T>>。 (CellDataFeatures 只是行值的包装器。)此函数称为列的 cellValueFactory(它是创建要在单元格中显示的值的函数)。

因此您需要为每个列提供单元格值工厂。在控制器的 initialize() 方法中,执行如下操作:

@FXML
private TableColumn<Student, Number> id ;

@FXML
private TableColumn<Student, String> name ;

public void initialize() {
    id.setCellValueFactory(cellData -> new SimpleIntegerProperty(cellData.getValue().getId()));
    name.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getName()));
    // ...
}

其余列也类似。