更改侦听器无法检测到更改-BooleanProperty JavaFX

时间:2019-01-09 21:10:31

标签: java javafx changelistener

我试图弄清楚如何检测某些对象属性的变化。因此,一开始我就意识到了如何做到这一点,并且它起作用了。我不知道是否有更好的方法(如果你们知道是否有更好的方法,请告诉我)。

好吧,问题是我还有另一个问题要解决,而且我不想检测更改,我只想获取属性的新设置值。所以我知道,使用javafx.beans.value.ChangeListener接口可以检测到某个属性上的每个更改,这是我的问题,因为我创建了一个实现ChangeListener(带有Object类型,以检测多个类型属性更改的类。例如Boolean ,整数等),由于某种原因,它无法检测到所有更改。让我向您展示代码示例:

 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()); 
}

我正在遍历一些“节点”对象,并从Ui控件获取值以将它们设置为节点属性。 这是CustomInterface类的基本部分:

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时,不会触发更改侦听器。

2 个答案:

答案 0 :(得分:0)

property.removeListener(this);

这可能会让您失望,除非您不断添加回听器,这似乎违反直觉。

答案 1 :(得分:0)

我发现,除非属性无效,否则不会触发ChangeListener,只有在属性值更改其值(旧值必须与新值不同)时才会发生。

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

  1. [JavaFX ObjectProperty that fires change events even if newValue == oldValue
  2. [How to make JavaFX Property Listener to fire an event even if the oldVaule and newValue are the same?

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