更改侦听器未检测到更改 - BooleanProperty JavaFX

Change listener doesn't detect changes - BooleanProperty JavaFX

我试图弄清楚如何检测某些对象属性的变化。所以一开始我就知道怎么做了,而且很管用。不知道有没有更好的方法(如果大家知道有更好的方法请告诉我)。

嗯问题是我还有另一个问题要解决,我不想检测变化,我只想获取属性的新设置值。所以我知道使用 javafx.beans.value.ChangeListener 接口你可以检测到一些 属性 上的每一个变化,这是我的问题,因为我创建了一个 class 实现 ChangeListener(使用对象类型,检测多个类型属性更改。例如布尔值、整数等)并且由于某种原因它没有检测到所有更改。让我向您展示代码示例:

 CustomInterface ci = new CustomInterface();

 for ( XBeeNode snode : nodes ) {

        Sensors sensors = snode.getSensors();
        ci.setMessagePacket(messagePacket);
        ci.setNode(snode);

        sensors.luxLowProperty().addListener(ci);
        ci.setProperty(sensors.luxLowProperty());
        sensors.luxLowProperty().set((int) luxesController.minSlider.getValue());

        sensors.luxHighProperty().addListener(ci);
        ci.setProperty(sensors.luxHighProperty());
        sensors.luxHighProperty().set((int) luxesController.maxSlider.getValue());

        sensors.luxIntermediateProperty().addListener(ci);
        ci.setProperty(sensors.luxIntermediateProperty());
        sensors.luxIntermediateProperty().set((int) luxesController.medSlider.getValue());

        sensors.photocellProperty().addListener(ci);
        ci.setProperty(sensors.photocellProperty());
        sensors.setPhotocell(luxesController.pheToggleButton.selectedProperty().getValue()); 
}

我循环浏览一些 "nodes" 对象并从 Ui 控件获取值以将它们设置为节点属性。 这是 CustomInterface class:

的重要部分
public class CustomInterface implements javafx.beans.value.ChangeListener<Object> {

Property property;
MessagePacket messagePacket;
XBeeNode node;
boolean someValueHasChanged = false;


public CustomInterface() {
}

public CustomInterface(Property property, MessagePacket messagePacket, XBeeNode node) {
    setProperty(property);
    setMessagePacket(messagePacket);
    setNode(node);
}

@Override
public void changed(ObservableValue<? extends Object> observable, Object oldValue, Object newValue) {

    Sensors sensors = node.getSensors();

    System.out.println(newValue);

    if (newValue != oldValue)
        someValueHasChanged = true;

    if (newValue instanceof Number)
    {
        if (newValue != oldValue || GeneralConstants.ForceMode.get()) {
            String value = ((Number)newValue).toString();
            if (property.equals(sensors.luxLowProperty()))
                messagePacket.setParameter(PARAM.LUX_LOW, value);
            else if (property.equals(sensors.luxIntermediateProperty()))
                messagePacket.setParameter(PARAM.LUX_INTERMEDIATE, value);
            else if (property.equals(sensors.luxHighProperty()))
                messagePacket.setParameter(PARAM.LUX_HIGH, value);


        }
    } else if (newValue instanceof Boolean)
    {
        if ( ((! newValue.equals(oldValue)) || GeneralConstants.ForceMode.get())) {
            if (property.equals(sensors.photocellProperty()))
                messagePacket.setParameter(PARAM.EXTERN_PHOTOCELL_MODE, (sensors.photocellProperty().get()) ? "1" : "0");
            else if (property.equals(sensors.movementProperty()))
                messagePacket.setParameter(PARAM.MOVEMENT_SENSOR, (sensors.movementProperty().get()) ? "1" : "0");

        }
    }

    property.removeListener(this);

}
}

如您所见,我正在重复使用相同的 ChangeListener。但由于某些奇怪的原因,当布尔属性设置为 false 时,更改侦听器不会被触发。

property.removeListener(this);

这可能会让你失望,除非你不断地添加听众,这似乎违反直觉。

好吧,我发现 ChangeListener 不会被触发,除非 属性 失效,只有当 属性 值改变它的值时才会发生这种情况(旧值必须与新值不同) .

有一些方法可以解决这个问题。我在 Whosebug 中发现了 2 个讨论可能会对您有所帮助:

  1. [JavaFX ObjectProperty that fires change events even if newValue == oldValue
  2. [

特别是我用另一种方式解决了它,我创建了一个 Helper class,我在其中使用了 ChangeListener,如果我想强制获取一个新值,只需使用它 Class。我不与您分享它,因为它的代码非常适合我的项目,它不是通用的,因此出于这个原因,上面的链接。