很难解释,所以我举个例子:
@Override
public void start(Stage primaryStage) throws Exception
{
final VBox vbox = new VBox();
final Scene sc = new Scene(vbox);
primaryStage.setScene(sc);
final TableView<Person> table = new TableView<>();
final TableColumn<Person, String> columnName = new TableColumn<Person, String>("Name");
table.getColumns().add(columnName);
final ObservableList<Person> list = FXCollections.observableArrayList();
list.add(new Person("Hello"));
list.add(new Person("World"));
Bindings.bindContent(table.getItems(), list);
columnName.setCellValueFactory(new PropertyValueFactory<>("name"));
vbox.getChildren().add(table);
final Button button = new Button("test");
button.setOnAction(event ->
{
final Person removed = list.remove(0);
removed.setName("Bye");
list.add(0, removed);
});
vbox.getChildren().add(button);
primaryStage.show();
}
public static class Person
{
private String name = "";
public Person(String n)
{
name = n;
}
public String getName()
{
return name;
}
public void setName(String n)
{
name = n;
}
}
在这个例子中,我展示了TableView
一个名为“Name”的单列。运行此示例代码,您将获得两行:第一行在“名称”列中带有“Hello”;第二行在“名称”列中带有“世界”。
此外,还有一个按钮,该按钮Person
从列表中删除第一个对象,然后对该对象进行一些更改,然后将其添加回相同的索引处。这样做会导致任何ListChangeListener
添加到的ObservableList
被触发,我已经测试这是真的。
我希望将带有“Hello”的行替换为“Bye”,但似乎TableView
继续显示“Hello”。如果我TimeLine
在将删除的对象添加回列表之前使用 a 添加延迟Person
,它将更改为“Bye”。
final Timeline tl = new Timeline(new KeyFrame(Duration.millis(30), ae -> list.add(0, removed)));
tl.play();
API有什么奇怪的地方吗?有没有办法在没有这个问题的情况下做到这一点?