如何在 JavaFX ListView 中滚动时禁用 setOnMouseClicked
How to disable setOnMouseClicked while scrolling in JavaFX ListView
我开发了一个小型 Javafx 应用程序并部署在我的 Android 设备中,我有一个 ListView
配置如下:
stuboutList.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
Dialog.show("You click the ListView!");
}
});
问题是: 每次我滚动 ListView
时,Dialog 都会不断弹出。
问题:如何在滚动时禁用setOnMouseClicked?
当您滚动 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
时,您可以在这个问题中看到:
我开发了一个小型 Javafx 应用程序并部署在我的 Android 设备中,我有一个 ListView
配置如下:
stuboutList.setOnMouseClicked(new EventHandler<MouseEvent>(){
@Override
public void handle(MouseEvent event) {
Dialog.show("You click the ListView!");
}
});
问题是: 每次我滚动 ListView
时,Dialog 都会不断弹出。
问题:如何在滚动时禁用setOnMouseClicked?
当您滚动 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
时,您可以在这个问题中看到: