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

标签 javafx touch mouseevent javafx-8

在 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/

相关文章:

java - 在另一个类中更改 TextArea

ios - 在 iPad 横向模式下触发下拉菜单

jquery - 阻止 jQuery 在触摸设备上运行 mouseenter

javascript - 我如何使用 jquery 添加文本以跨度

javascript - 上下文菜单的 jquery 停止事件

javascript - 如何创建用于上下滚动的自定义事件?

JavaFX 我无法在场景生成器中创建的 Canvas 上绘制任何内容

JavaFX 检测舞台屏幕位置的变化

JavaFx - 将 MapProperty 键集绑定(bind)到 SetProperty

touch - 顺风。单击移动设备时的蓝色矩形