JavaFX Slider 不调用 valueProperty 的 ChangeListener 来获取最小值和最大值

标签 java javafx slider javafx-8

我遇到这样的问题:当 slider 旋钮处于最小或最大极限时,JavaFX slider 不会调用 valueProperty 的 ChangeListener。我只想在 slider 值更改后(而不是在拖动 slider 时)执行一些代码。我尝试使用以下代码来实现此目的:

Slider slider = new Slider();
slider.setMin(0);
slider.setMax(10);
slider.setMajorTickUnit(5);
slider.setMinorTickCount(5);
slider.setBlockIncrement(1);
slider.setSnapToTicks(true);
slider.setShowTickMarks(true);
slider.setShowTickLabels(true);

ChangeListener<? super Number> valueListener = (observable, oldValue, newValue) -> {
    if (!slider.isValueChanging()) {
        System.out.println("Value changed");
    }
};

slider.valueProperty().addListener(valueListener);

您将看到,当您拖动并释放 slider 时,每次都会打印出字符串 Valuechanged,除非 slider 旋钮在 0 或 10 位置释放。这是预期的行为吗?或者我错过了什么?

最佳答案

问题是 fx 属性设计的结果:与 ol' bean 规范相比,它们是完全独立的,每个属性在变化时独立于另一个而触发。结果是,一个属性的监听器在对更改使用react时不得查询任何其他属性。

应用于 Slider 的 value/isValueAdjusting 属性的上下文:

  • 监听value时,调整状态未指定
  • 监听调整时,值状态未指定

归根结底,Slider 的 api 实在是太弱了,无法在不付出相当大的努力的情况下服务于常见用例(仅在更改完成时才对其使用react)。

一个出路可能是使用增强型 API 的自定义 slider 。下面的概述基于观察(注意:实现细节!),所有内部结构都通过 slider.adjustValue(value) 设置最终值。增强型 slider

  • 添加一个属性 adjustmentValue,该属性会在更改最终完成时更新
  • 在调整值结束时更新调整值

大纲(不完整且未经正式测试):

public static class AdjustedSlider extends Slider {

    private DoubleProperty adjustedValue;

    public AdjustedSlider() {
        super();
    }

    public AdjustedSlider(double min, double max, double value) {
        super(min, max, value);
    }

    public DoubleProperty adjustedValueProperty() {
        if (adjustedValue == null) {
            adjustedValue = new SimpleDoubleProperty(this, "adjustedValue", 0);
        }
        return adjustedValue;
    }

    public double getAdjustedValue() {
        return adjustedValueProperty().get();
    }

    private void setAdjustedValue(double value) {
        adjustedValueProperty().set(value);
    }

    @Override
    public void adjustValue(double newValue) {
        super.adjustValue(newValue);
        setAdjustedValue(getValue());
    }

}

关于JavaFX Slider 不调用 valueProperty 的 ChangeListener 来获取最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51089812/

相关文章:

java - 相互身份验证的工作原理

Javafx .exe 在调用 javafx.scene.effect.DropShadow 时崩溃

java - 当从 Start 方法调用 System.Exit 时,JavaFX8 中出现奇怪的异常

macos - Java 7 是否只能在 x64 位 MAC OS X 上运行?

jquery - 如何使用 jQuery 单击按钮时暂停 YouTube 视频?

objective-c - 在文本字段中显示 Unicode 字符

java - 如何从 JPanel 类访问 JFrame 组件?

java - 必须声明元素类型 "hibernate-mapping"

JavaFX:将多个 Hbox 添加到选项卡中的内容时出错

jquery - 如何在 jcarousel 中获得可见的中间 li?