JavaFX 的 ListChangeListener.Change.getRemoved() 可以返回不连续的项目吗?
问题
当从 中删除项时,将触发一个更改事件,其中提供删除的位置,getRemoved()
提供已删除项的列表。文档说:ObservableList
getFrom()
该方法返回已从列表中替换或删除的元素的列表。
getRemoved()
它没有这样说,但我认为它暗示项目清单是原始清单的连续子清单。我已经用这个假设编写了很多代码,但现在在使用TreeTableView
的选择模型时遇到了困难,该模型的行为方式并非如此。
例
以具有三个“节点”行的简单树表为例。如果我选择这三行...
...,然后单击并选择中间行...
...触发的更改事件如下所示:treeTableView.getSelectionModel().getSelectedItems()
{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0, }
在单个更改事件中,它报告“节点 1”和“节点 3”已从列表的索引 0 中删除。selectedItems
我本来希望该对象有两个单独的删除事件,由调用分隔。第一个调用会告诉我“节点 1”在索引 0 处被删除,第二个调用会告诉我“节点 3”在索引 1 处被删除。但是不,我得到一个事件,其中两行同时列出。Change
next()
next()
next()
问题
真的可以退回不连续的物品吗?这是我对列表更改事件如何工作的误解,还是一个错误?getRemoved()
TreeTableView
通常情况下,我不愿意责怪标准库,但这不会是我在JavaFX中发现的第一个错误,所以这不是不可想象的。
更新
如果我添加对 的调用,行为就会改变。我得到了我所期望的,删除分为两部分:setShowRoot(false)
{ [TreeItem [ value: Node 1 ]] removed at 0, [TreeItem [ value: Node 3 ]] removed at 1, }
另外,这是我的MCVE:
import java.util.*;
import javafx.application.*;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.*;
public class TreeTableSelectionEvents extends Application {
public void start(Stage stage) {
// Root node.
TreeItem<String> root = new TreeItem<>("Root");
root.setExpanded(true);
root.getChildren().setAll(Arrays.asList(
new TreeItem<>("Node 1"),
new TreeItem<>("Node 2"),
new TreeItem<>("Node 3")
));
// Single column.
TreeTableColumn<String, String> column = new TreeTableColumn<>("Column");
column.setPrefWidth(150);
column.setCellValueFactory((TreeTableColumn.CellDataFeatures<String, String> p) -> {
return new ReadOnlyStringWrapper(p.getValue().getValue());
});
// Tree table.
TreeTableView<String> table = new TreeTableView<>(root);
table.getColumns().add(column);
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
// table.setShowRoot(false);
table.getSelectionModel().getSelectedItems().addListener(
(ListChangeListener.Change<? extends TreeItem<String>> change) -> {
System.out.printf("item change = %s, list is now %s%n", change, change.getList());
}
);
table.getSelectionModel().getSelectedIndices().addListener(
(ListChangeListener.Change<? extends Integer> change) -> {
System.out.printf("index change = %s, list is now %s%n", change, change.getList());
}
);
// Stage.
stage.setScene(new Scene(table));
stage.show();
}
}