JavaFX TableView没有更新

时间:2017-12-20 18:36:40

标签: java javafx fxml

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

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

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

TableView

  1. A collection of TableColumns
  2. 一个collection of items,每个项目代表表格中一行显示的值。
  3. 为了使列显示该列中每个单元格中的值,该列需要一个函数,将该行的值映射到要在相应单元格中显示的值。具体来说,如果您有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()));
        // ...
    }
    

    ,其余列也类似。