更改侦听器未检测到更改 - 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 个讨论可能会对您有所帮助:
- [JavaFX ObjectProperty that fires change events even if newValue == oldValue
- [
特别是我用另一种方式解决了它,我创建了一个 Helper class,我在其中使用了 ChangeListener,如果我想强制获取一个新值,只需使用它 Class。我不与您分享它,因为它的代码非常适合我的项目,它不是通用的,因此出于这个原因,上面的链接。
我试图弄清楚如何检测某些对象属性的变化。所以一开始我就知道怎么做了,而且很管用。不知道有没有更好的方法(如果大家知道有更好的方法请告诉我)。
嗯问题是我还有另一个问题要解决,我不想检测变化,我只想获取属性的新设置值。所以我知道使用 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 个讨论可能会对您有所帮助:
- [JavaFX ObjectProperty that fires change events even if newValue == oldValue
- [
特别是我用另一种方式解决了它,我创建了一个 Helper class,我在其中使用了 ChangeListener,如果我想强制获取一个新值,只需使用它 Class。我不与您分享它,因为它的代码非常适合我的项目,它不是通用的,因此出于这个原因,上面的链接。