[英]Extrange behaviour on expandNode TreeTableView JavaFx
I have a TreeTableView wich have 3 levels, and I just want to let users to select nodes of one type (Only first level).我有一个 TreeTableView 有 3 个级别,我只想让用户选择一种类型的节点(仅第一级)。 So i use this solution TreeView - Certain TreeItems are not allowed to be selected with some necesary changes to fit TreeTableView.所以我使用这个解决方案TreeView - 不允许选择某些 TreeItems 进行一些必要的更改以适合 TreeTableView。
It works fine but when I select one node and expand above's node, selection moves to one prohibited selection node.它工作正常,但是当我选择一个节点并展开上面的节点时,选择会移动到一个禁止的选择节点。
Can anyone point me in the right direction.任何人都可以指出我正确的方向。
public class ViviendaSelectionModel extends TreeTableViewSelectionModel<Treeable<?>> {
private final TreeTableViewSelectionModel<Treeable<?>> selectionModel;
public ViviendaSelectionModel(TreeTableViewSelectionModel<Treeable<?>> selectionModel, TreeTableView<Treeable<?>> tree) {
super(tree);
this.selectionModel = selectionModel ;
this.selectionModel.setSelectionMode(SelectionMode.MULTIPLE);
this.selectionModel.setCellSelectionEnabled(false);
selectionModeProperty().bindBidirectional(selectionModel.selectionModeProperty());
}
@Override
public ObservableList<Integer> getSelectedIndices() {
return selectionModel.getSelectedIndices() ;
}
@Override
public ObservableList<TreeItem<Treeable<?>>> getSelectedItems() {
return selectionModel.getSelectedItems() ;
}
@Override
public void selectIndices(int index, int... indices)
List<Integer> indicesToSelect = Stream.concat(Stream.of(index), IntStream.of(indices).boxed())
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.collect(Collectors.toList());
if (indicesToSelect.isEmpty()) {
return ;
}
selectionModel.selectIndices(indicesToSelect.get(0),
indicesToSelect.stream().skip(1).mapToInt(Integer::intValue).toArray());
}
@Override
public void selectAll() {
List<Integer> indicesToSelect = IntStream.range(0, getTreeTableView().getExpandedItemCount())
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.boxed()
.collect(Collectors.toList());
if (indicesToSelect.isEmpty()) {
return ;
}
selectionModel.selectIndices(0,
indicesToSelect.stream().skip(1).mapToInt(Integer::intValue).toArray());
}
@Override
public void selectFirst() {
IntStream.range(0, getTreeTableView().getExpandedItemCount())
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.findFirst()
.ifPresent(selectionModel::select);
}
@Override
public void selectLast() {
IntStream.iterate(getTreeTableView().getExpandedItemCount() - 1, i -> i - 1)
.limit(getTreeTableView().getExpandedItemCount())
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.findFirst()
.ifPresent(selectionModel::select);
}
@Override
public void clearAndSelect(int index) {
int toSelect = index ;
int direction = selectionModel.getSelectedIndex() < index ? 1 : -1 ;
while (toSelect >= 0 && toSelect < getTreeTableView().getExpandedItemCount() && ! (getTreeTableView().getTreeItem(toSelect).getValue() instanceof Vivienda)) {
toSelect = toSelect + direction ;
}
if (toSelect >= 0 && toSelect < getTreeTableView().getExpandedItemCount()) {
selectionModel.clearAndSelect(toSelect);
}
}
@Override
public void select(int index) {
int toSelect = index ;
int direction = selectionModel.getSelectedIndex() < index ? 1 : -1 ;
while (toSelect >= 0 && toSelect < getTreeTableView().getExpandedItemCount() && ! (getTreeTableView().getTreeItem(toSelect).getValue() instanceof Vivienda)) {
toSelect = toSelect + direction ;
}
if (toSelect >= 0 && toSelect < getTreeTableView().getExpandedItemCount()) {
selectionModel.select(toSelect);
}
}
@Override
public void select(TreeItem<Treeable<?>> obj) {;
if (obj.getValue() instanceof Vivienda) {
selectionModel.select(obj);
}
}
@Override
public void clearSelection(int index) {
selectionModel.clearSelection(index);
}
@Override
public void clearSelection() {
selectionModel.clearSelection();
}
@Override
public boolean isSelected(int index) {
return selectionModel.isSelected(index);
}
@Override
public boolean isEmpty() {
return selectionModel.isEmpty();
}
@Override
public void selectPrevious() {
int current = selectionModel.getSelectedIndex() ;
if (current > 0) {
IntStream.iterate(current - 1, i -> i - 1).limit(current)
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.findFirst()
.ifPresent(selectionModel::select);
}
}
@Override
public void selectNext() {
this.selectNext();
int current = selectionModel.getSelectedIndex() ;
if (current < getTreeTableView().getExpandedItemCount() - 1) {
IntStream.range(current + 1, getTreeTableView().getExpandedItemCount())
.filter(i -> getTreeTableView().getTreeItem(i).getValue() instanceof Vivienda)
.findFirst()
.ifPresent(selectionModel::select);
}
}
@Override
public ObservableList<TreeTablePosition<Treeable<?>, ?>> getSelectedCells() {
return this.selectionModel.getSelectedCells();
}
@Override
public boolean isSelected(int row, TableColumnBase<TreeItem<Treeable<?>>, ?> column) {
return this.selectionModel.isSelected(row, column);
}
@Override
public void select(int row, TableColumnBase<TreeItem<Treeable<?>>, ?> column) {
if (getTreeTableView().getTreeItem(row).getValue() instanceof Vivienda) {
this.selectionModel.select(row, column);
}
System.out.println(row + " " + column.getText() + " " + column.getCellData(row));
}
@Override
public void clearAndSelect(int row, TableColumnBase<TreeItem<Treeable<?>>, ?> column) {
if (getTreeTableView().getTreeItem(row).getValue() instanceof Vivienda) {
this.selectionModel.clearAndSelect(row, column);
}else {
clearSelection();
}
}
@Override
public void clearSelection(int row, TableColumnBase<TreeItem<Treeable<?>>, ?> column) {
this.selectionModel.clearSelection(row, column);
}
@Override
public void selectLeftCell() {
this.selectionModel.selectLeftCell();
}
@Override
public void selectRightCell() {
this.selectionModel.selectRightCell();
}
@Override
public void selectAboveCell() {
this.selectionModel.selectAboveCell();
}
@Override
public void selectBelowCell() {
this.selectionModel.selectBelowCell();
}
}
I do not know what happened, but now it woks.我不知道发生了什么,但现在它起作用了。 I Have changed from java 11 to java 8, but i don't know if this is the reason.我已从 java 11 更改为 java 8,但我不知道这是不是原因。
Anyway, now the above code seems to work properly.无论如何,现在上面的代码似乎可以正常工作。
Implementing a selection-model for a TreeTableView is a bit more complex compared to the TreeView example you worked from in the question you referenced.与您在引用的问题中使用的 TreeView 示例相比,为 TreeTableView 实现选择模型要复杂一些。 You can take a look at at the question here where I implement a custom FilteredTreeTableViewSelectionModel
.您可以在这里查看我实现自定义FilteredTreeTableViewSelectionModel
。
For your particular example you just need to provide a custom TreeItemSelectionFilter
that filters on instances of Vivienda
as follows:对于您的特定示例,您只需要提供一个自定义TreeItemSelectionFilter
来过滤Vivienda
实例,如下所示:
TreeItemSelectionFilter<S> treeItemFilter = treeItem -> getValue() instanceof Vivienda;
and the selection-filtering should work.并且选择过滤应该有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.