问题
当从 中删除项目时,会触发ObservableList
一个更改事件getFrom()
,其中给出了删除的位置并getRemoved()
给出了已删除项目的列表。文档说:
该
getRemoved()
方法返回已被替换或从列表中删除的元素列表。
它没有这样说明,但我认为它暗示项目列表是原始列表的连续子列表。我已经用这个假设写了很多代码,但是现在遇到了TreeTableView
's selection model 的困难,它的行为不是那样的。
例子
以具有三个“节点”行的简单树表为例。如果我选择这三行...
...然后单击并仅选择中间行...
...触发的更改事件treeTableView.getSelectionModel().getSelectedItems()
如下所示:
{ [TreeItem [ value: Node 1 ], TreeItem [ value: Node 3 ]] removed at 0, }
在单个更改事件中,它报告“节点 1”和“节点 3”已从selectedItems
列表的索引 0 中删除。
我本来希望该Change
对象有两个单独的删除事件,由next()
调用分隔。第一次调用next()
会告诉我“节点 1”在索引 0 处被删除,第二次调用next()
会告诉我“节点 3”在索引 1 处被删除。但是不,我得到一个事件,两行都在一次。
问题
真的可以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();
}
}