在 JavaFX 中,我有一个 ScrollPane
,其中包含一个 TilePane
,其中包含各种 Button
。
此应用程序将在触摸屏上运行,因此用户将通过在 ScrollPane 中拖动手指来滚动,但如果手指开始在子 Button 上拖动,则 ScrollPane 不会滚动。由于如今触摸 UI 的工作方式,这对用户来说是意想不到的行为。
我希望按钮响应点击,但我希望将拖动事件发送到底层的 ScrollPane(如果它使用拖动事件平移)。
我已将 ScrollPane
的 setPannable()
属性设置为 true,并尝试在 Button
上设置处理程序的各种 setOnDrag*()
方法然后触发 ScrollPane
的 fireEvent()
方法,但没有任何反应。
例子:
button.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
scrollPane.fireEvent(event);
}
});
我应该怎么做?
最佳答案
按钮的问题在于 ButtonBehavior
为 MouseEvent.MOUSE_PRESSED
注册了默认映射。此映射使用事件并且 ScrollPane 不再接收它以进行平移计算。在以前的 JFX 版本中,可以简单地调用 ButtonSkin.consumeMouseEvents(false)
来解决这个问题。对于当前版本,这不再有效。我认为这是一个错误,我可能会在有时间时报告它。
作为解决方法,我将 MouseEvent.MOUSE_PRESSED
重定向到 ScrollPane
的 viewPort
:
ScrollPane pane = new ScrollPane(bar)
{
@Override
protected Skin<?> createDefaultSkin()
{
Skin<?> skin = super.createDefaultSkin();
for (Node ch : getChildren())
{
if (ch.getStyleClass().contains("viewport"))
viewPort = ch;
}
return skin;
}
};
pane.addEventFilter(MouseEvent.MOUSE_PRESSED, e ->
{
if (lastFiredEvent != e)
{
lastFiredEvent = e.copyFor(e.getSource(), viewPort);
viewPort.fireEvent(lastFiredEvent);
}
});
编辑:我报告了这个错误。可用时会在此处发布链接。
关于JavaFX:如何平移包含 Button 子项的 ScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436773/