gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:04:01 25 4
gpt4 key购买 nike

我遇到这样的问题:当 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com