未调用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,但实际上没有调用过MouseDragEvent(例如,在检测到拖动时,应该在我开始拖动滑块时调用它)。我找到了这篇文章,但是并没有解决我的问题。 JavaFX mouse drag events not firing

chejixian 回答:未调用MouseDragEvent

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

话虽如此,您可能不想使用鼠标事件来知道Slider的值何时更改。它将监听您的Slider的一个或多个属性。例如,您可以侦听或绑定到documentation属性以始终知道当前值。还有value属性:

为true时,指示此Slider的当前值正在更改。它提供值正在更改的通知。一旦计算出该值,它将重置为false。

该属性在用户拖动拇指时为true,并且在用户“放下”拇指时变为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文件添加这样的侦听器-请参见valueChanging

<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属性。

本文链接:https://www.f2er.com/2790477.html

大家都在问