MouseDragEvent не вызывается - PullRequest
       30

MouseDragEvent не вызывается

0 голосов
/ 10 января 2020

Я хочу иметь возможность прочитать значение моего ползунка, и поэтому я использую прослушиватель событий для моего класса контроллера:

//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 не запускаются

1 Ответ

3 голосов
/ 10 января 2020

MouseDragEvent ассоциируется с жестами «полный пресс-перетаскивание-отпускание». Такие жесты должны быть явно запущены путем вызова Node#startFullDrag() внутри обработчика DRAG_DETECTED. Документация из MouseEvent предоставляет дополнительную информацию о различных жестах перетаскивания.

С учетом сказанного вы, вероятно, не хотите использовать события мыши, чтобы знать, когда ваш Slider ' Значение изменилось. Было бы слушать одно или несколько свойств вашего Slider. Например, вы можете прослушивать или связывать свойство value, чтобы всегда знать текущее значение. Также есть свойство valueChanging:

Если true, указывает, что текущее значение этого ползунка изменяется. Это обеспечивает уведомление, что значение изменяется. Как только значение вычислено, оно сбрасывается обратно в false.

Это свойство будет иметь значение true, когда пользователь перетаскивает большой палец, и станет false, когда пользователь «уронит» большой палец. Чтобы прослушать свойство при использовании F XML, вы можете вставить Slider в контроллер и добавить к нему прослушиватель методом initialize:

public class Controller {

  @FXML private Slider slider;

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

Если вы хотите, однако, вы можно добавить такого слушателя через файл F XML - см. Введение в F XML:

<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.

...