[英]Extrange behaviour on expandNode TreeTableView JavaFx
我有一個 TreeTableView 有 3 個級別,我只想讓用戶選擇一種類型的節點(僅第一級)。 所以我使用這個解決方案TreeView - 不允許選擇某些 TreeItems 進行一些必要的更改以適合 TreeTableView。
它工作正常,但是當我選擇一個節點並展開上面的節點時,選擇會移動到一個禁止的選擇節點。
任何人都可以指出我正確的方向。
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();
}
}
我不知道發生了什么,但現在它起作用了。 我已從 java 11 更改為 java 8,但我不知道這是不是原因。
無論如何,現在上面的代碼似乎可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.