首页 > 解决方案 > 未调用 MouseDragEvent

问题描述

我希望能够读取我的滑块值,因此我为我的控制器类使用了一个事件侦听器:

//Controller class
@FXML
    private Slider gridSlider;

@FXML
    void sliderChange(MouseDragEvent event) {
        int sliderValue = (int) gridSlider.getValue();
        System.out.println(sliderValue);
    }

//My FXML class
<Slider fx:id="gridSlider" blockIncrement="1.0" layoutX="203.0" layoutY="84.0" majorTickUnit="8.0" max="32.0" min="8.0" minorTickCount="7" nodeOrientation="LEFT_TO_RIGHT" onMouseDragReleased="#sliderChange" prefHeight="38.0" prefWidth="180.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" value="8.0">

我已经尝试了每一个 MouseDragEvent 并且实际上没有调用任何 MouseDragEvents (就像在检测到拖动时应该在我开始拖动滑块时调用的那样)。我找到了这篇文章,但它并没有解决我的问题。 JavaFX鼠标拖动事件未触发

标签: javafxmouseeventfxml

解决方案


MouseDragEvent与“完全按下-拖动-释放”手势相关联。此类手势必须通过在处理程序Node#startFullDrag()内部调用来显式启动DRAG_DETECTED。的文档MouseEvent提供了有关不同拖动手势的更多信息。

话虽如此,您可能不想使用鼠标事件来知道您Slider的值何时发生了变化。这将是听你的一个或多个属性Slider。例如,您可以侦听或绑定到value属性以始终知道当前值。还有valueChanging楼盘:

如果为 true,则表示此 Slider 的当前值正在更改。它提供值正在更改的通知。计算出该值后,将其重置为 false。

当用户拖动拇指时,该属性将为真,一旦用户“放下”拇指,该属性将变为假。要在使用 FXML 时监听该属性,您可以将其Slider注入控制器并在initialize方法中添加一个监听器:

public class Controller {

  @FXML private Slider slider;

  @FXML
  private void initialize() {
    slider.valueChangingProperty().addListener((obs, ov, nv) -> {
      if (!nv) {
        // do something...
      }
    });
  }
}

但是,如果您愿意,可以通过 FXML 文件添加这样的侦听器——请参阅FXML 简介

<StackPane ...>
  <Slider onValueChangingChange="#handleValueChangingChange"/>
</StackPane>
public class Controller {

  @FXML
  private void handleValueChangingChange(ObservableValue<Boolean> obs, Boolean ov, Boolean nv) {
    if (!nv) {
      // Do something...
    }
  }
}

注意:我的示例使用该valueChanging属性,因为它似乎提供了您想要的行为,因为您试图在释放鼠标时进行监听。但是,可以以编程方式更改该值,据我所知,这不会影响该valueChanging属性。因此,如果您想始终知道当前值,则需要观察该value属性。


推荐阅读