Отключить выделение ячеек SpreadsheetView с помощью событий мыши / клавиши, но оставьте возможность прокручивать представление

Я пишу мастер импорта Excel, который загружает электронную таблицу пользователя в ControlsFX SpreadsheetView. Затем пользователь может определить соответствующие столбцы (т. Е. Имя и фамилию и т. Д.), Которые будут импортированы в приложение, с помощью набора полей со списком. Каждое поле со списком содержит список доступных столбцов. Когда пользователь делает выбор в поле со списком, соответствующий столбец добавляется к диапазону выбора модели выбора.

Выбор столбцов должен выполняться только через поля со списком, и пользовательские щелчки по ячейкам в представлении электронной таблицы должны игнорироваться (т.е. не изменять содержимое модели выбора).

Однако я не могу найти способ отключить щелчки мышью по ячейкам или заголовкам столбцов. Решение связанного вопроса о том, как отключить щелчки в TableView, не дает удовлетворительного ответа: setMouseTransparent(true) по сути отключает весь вид.

В моем случае пользователь должен иметь возможность прокручивать представление, чтобы найти релевантные столбцы, поскольку не все пользователи приложения структурировали свою электронную таблицу в одном и том же порядке столбцов, и столбец может не отображаться без горизонтальной прокрутки.

Итак, для повторения: мне нужно использовать щелчки мыши на ячейках и заголовках столбцов, чтобы предотвратить изменение выбора столбцов, сделанных с помощью комбинированных блоков. Как мне это сделать? (К вашему сведению: использование событий мыши в представлении электронной таблицы [setOnMousePressed|Released|Clicked(mEvent -> mEvent.consume()] не имеет никакого эффекта.)

1 ответ

Решение

На самом деле, когда вы используете методы setOnMousePressed, вы добавляете EventHandler. EventHandler происходит в более поздней цепочке пузырящихся событий.

Вам нужно добавить EventFilter, который будет перехватывать событие до того, как SpreadsheetView получит его.

Например, я сделал это:

spreadSheetView.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                event.consume();
            }
        });
        spreadSheetView.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                event.consume();
            }
        });
        spreadSheetView.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                event.consume();
            }
        });

И это работает. Хотя я действительно не знаю побочного эффекта такой манипуляции..

Другие вопросы по тегам