gpt4 book ai didi

JavaFX:如何平移包含 Button 子项的 ScrollPane?

转载 作者:行者123 更新时间:2023-12-05 08:09:06 25 4
gpt4 key购买 nike

在 JavaFX 中,我有一个 ScrollPane,其中包含一个 TilePane,其中包含各种 Button

此应用程序将在触摸屏上运行,因此用户将通过在 ScrollPane 中拖动手指来滚动,但如果手指开始在子 Button 上拖动,则 ScrollPane 不会滚动。由于如今触摸 UI 的工作方式,这对用户来说是意想不到的行为。

我希望按钮响应点击,但我希望将拖动事件发送到底层的 ScrollPane(如果它使用拖动事件平移)。

我已将 ScrollPanesetPannable() 属性设置为 true,并尝试在 Button 上设置处理程序的各种 setOnDrag*() 方法然后触发 ScrollPanefireEvent() 方法,但没有任何反应。

例子:

    button.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
scrollPane.fireEvent(event);
}
});

我应该怎么做?

最佳答案

按钮的问题在于 ButtonBehaviorMouseEvent.MOUSE_PRESSED 注册了默认映射。此映射使用事件并且 ScrollPane 不再接收它以进行平移计算。在以前的 JFX 版本中,可以简单地调用 ButtonSkin.consumeMouseEvents(false) 来解决这个问题。对于当前版本,这不再有效。我认为这是一个错误,我可能会在有时间时报告它。

作为解决方法,我将 MouseEvent.MOUSE_PRESSED 重定向到 ScrollPaneviewPort:

   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);
}
});

编辑:我报告了这个错误。可用时会在此处发布链接。

https://bugs.openjdk.java.net/browse/JDK-8284878

关于JavaFX:如何平移包含 Button 子项的 ScrollPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41436773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com