我试图弄清楚如何检测某些对象属性的变化。因此,一开始我就意识到了如何做到这一点,并且它起作用了。我不知道是否有更好的方法(如果你们知道是否有更好的方法,请告诉我)。
好吧,问题是我还有另一个问题要解决,而且我不想检测更改,我只想获取属性的新设置值。所以我知道,使用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时,不会触发更改侦听器。
答案 0 :(得分:0)
property.removeListener(this);
这可能会让您失望,除非您不断添加回听器,这似乎违反直觉。
答案 1 :(得分:0)
我发现,除非属性无效,否则不会触发ChangeListener,只有在属性值更改其值(旧值必须与新值不同)时才会发生。
有一些方法可以解决问题。我在StackOverflow中发现了2个讨论,可能对您有帮助:
我特别用另一种方法解决了这个问题,我创建了一个Helper类,在其中使用ChangeListener,如果我想强制获取新值,则只需使用该类。我不与您共享它,因为它的代码非常适合我的项目,并且不是通用的,因此,出于上述原因,上面的链接。