Отключить выделение ячеек 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();
}
});
И это работает. Хотя я действительно не знаю побочного эффекта такой манипуляции..