Поведение в режиме Extrange на ноде TreeTableView JavaFx - PullRequest
0 голосов
/ 05 марта 2019

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

}

1 Ответ

0 голосов
/ 12 марта 2019

Я не знаю, что случилось, но сейчас оно просыпается.Я перешел с java 11 на java 8, но я не знаю, в этом ли причина.

В любом случае, теперь приведенный выше код работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...