JavaFX — показать диалоговое окно предупреждения в событии ChangeListener

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

this.spinnerColumns.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(2,20));

this.spinnerColumns.getValueFactory().valueProperty().addListener((observable, oldValue, newValue) -> {

  if(oldValue > newValue) {
    // Ask for permission
    System.out.println("Ask for permission");
    Alert alert = new Alert(Alert.AlertType.WARNING);
    alert.setTitle("Error");
    alert.setHeaderText("Ask something...");
    alert.showAndWait();

    if(alert.getResult() == ButtonType.OK) {
      // do something
    }
  }
});

Этот код работает неправильно. Когда отображается предупреждение, счетчик продолжает уменьшать свое значение, пока не будет достигнуто минимальное значение. Некоторые предложения, как это сделать?


person fc90    schedule 29.04.2017    source источник


Ответы (1)


Насколько я знаю, трудно остановить вращение без использования отражения... Попробуйте этот код.

if(oldValue > newValue) {

    try {
        Skin<?> skin = this.spinnerColumns.getSkin();
        Object behavior = skin.getClass().getMethod("getBehavior").invoke(skin);
        behavior.getClass().getMethod("stopSpinning").invoke(behavior);
    } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
        e.printStackTrace();
        return; // If refleciton failed, do nothing
    }

    // Ask for permission
person monolith52    schedule 30.04.2017