Как отключить setOnMouseClicked при прокрутке в JavaFX ListView

Я разработал небольшое приложение Javafx и развернул его на своем устройстве Android. У меня есть ListView, который настроен примерно так:

stuboutList.setOnMouseClicked(new EventHandler<MouseEvent>(){
    @Override
    public void handle(MouseEvent event) {
        Dialog.show("You click the ListView!");
    }
});

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

ВОПРОС: Как отключить setOnMouseClicked при ПРОКРУТКЕ?


person Ethyl Casin    schedule 25.04.2016    source источник


Ответы (1)


Когда вы прокручиваете ListView, жест смахивания вызывает событие перетаскивания мышью. Вы можете установить флаг при обнаружении события перетаскивания и использовать следующее событие щелчка мышью.

public class ScrollListener {

    private BooleanProperty scrolling;

    public ScrollListener(Node observableNode) {
        scrolling = new ReadOnlyBooleanWrapper(false);

        observableNode.addEventHandler(MouseEvent.DRAG_DETECTED, e -> scrolling.set(true));

        observableNode.addEventFilter(MouseEvent.MOUSE_CLICKED, evt -> {
            if (scrolling.get()) {
                scrolling.set(false);
                evt.consume();
            }
        });

        observableNode.addEventHandler(MouseEvent.MOUSE_EXITED, e -> scrolling.set(false));
    }

    public ReadOnlyBooleanProperty scrollingProperty() {
        return scrolling;
    }

    public boolean isScrolling() {
        return scrolling.get();
    }
}

Другая возможность заключается в том, чтобы вы использовали Gluon CharmListView, который сам заботится о событии щелчка мыши, но (до сих пор) не так удобен в использовании, как стандартный ListView, например. когда вам нужно получить доступ к SelectionModel, как вы можете видеть в этом вопросе: CharmListView SelectedItemProperty?

person jns    schedule 25.04.2016
comment
Привет, спасибо за ответ, как я могу интегрировать ваш код в мой код выше? ;) - person Ethyl Casin; 26.04.2016
comment
Вы можете вызвать его в методе initialize() контроллера представления: new ScrollListener(listView);. Также имейте в виду, что вам нужно удалить обработчики событий/фильтр, если вам нужно беспокоиться о ресурсах. - person jns; 26.04.2016