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
有
- 一个collection of
TableColumn
s,并且
- 一个collection of
item
s,每一项代表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()));
// ...
}
其余列也类似。
调用 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
有
- 一个collection of
TableColumn
s,并且 - 一个collection of
item
s,每一项代表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()));
// ...
}
其余列也类似。