У меня есть 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();
}
}