JavaFX TableView不更新[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

所以,我有一个带有吸气剂的学生。

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;
}

我有桌子的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>

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

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

    table.getItems().setAll(lst);

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

控制器和方法正确链接,因为我可以看到println的输出,我可以看到表中的更改,但没有显示数据。示例(触发方法之前和之后):

Before pressing the button to trigger the method After

任何帮助表示赞赏。

java javafx fxml
1个回答
2
投票

一个TableView

  1. 一个collection of TableColumns,和
  2. 一个collection of items,每个项目代表表格中一行显示的值。

为了使列显示该列中每个单元格中的值,该列需要一个函数,将该行的值映射到要在相应单元格中显示的值。具体来说,如果你有一个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()));
    // ...
}

并且对于其余列也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.