未调用 MouseDragEvent

MouseDragEvent not called

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

//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 的 none 实际上已经被调用(就像在检测到拖动时应该在我开始拖动滑块时被调用)。我找到了这个 post,但它并没有解决我的问题。

MouseDragEvent 与 "full press-drag-release" 手势相关联。此类手势必须通过调用 MouseEventNode#startFullDrag() inside a DRAG_DETECTED handler. The documentation 来明确启动,提供了有关不同拖动手势的更多信息。

话虽如此,您可能不想使用鼠标事件来了解 Slider 的值何时更改。它将听取您 Slider 的一个或多个属性。例如,您可以收听或绑定到 value property to always know the current value. There's also the valueChanging 属性:

When true, indicates the current value of this Slider is changing. It provides notification that the value is changing. Once the value is computed, it is reset back to false.

当用户拖动拇指时 属性 为真,一旦用户 "drops" 拇指拖动则为假。要在使用 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 文件添加此类侦听器 — 请参阅 Introduction to 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 属性.