当前位置: 首页 > 知识库问答 >
问题:

更改监听器不检测更改-BooleanProperty JavaFX

戚衡
2023-03-14

我试图找出如何检测一些对象属性的变化。所以一开始我就意识到该怎么做,而且很管用。我不知道是否有更好的方法(如果你们知道是否有更好的方法,请告诉我)。

问题是,我还有另一个问题要解决,我不想检测变化,我只想获得属性的新设置值。因此,我知道使用javafx.beans.value.ChangeListener接口可以检测某个属性的每一个更改,这就是我的问题所在,因为我创建了一个实现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()); 
}

我正在遍历一些“节点”对象,并从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时,更改监听器不会被触发。

共有1个答案

燕永昌
2023-03-14
property.removeListener(this);

这可能会让您感到厌烦,除非您不断地向后添加监听器,这似乎违背了直觉。

 类似资料:
  • 我做了一个程序,动态地从一个面板获取数据,但是我的代码需要用户点击输入按钮来更新数据。有没有一个更改监听器或其他监听器可以在任何时候更新Jtext field中的数据?谢谢!

  • 在JavaScript中是否可以监听属性值的更改?例如: 我想响应属性中的任何更改。 我已经阅读了对象,以及该对象的替代对象(包括使用动画事件的对象)。据我所知,它们是关于实际DOM的更改。我更感兴趣的是对一个特定DOM元素的属性更改,所以我不认为仅此而已。当然,在我的实验中,这似乎不起作用。 我希望在没有jQuery的情况下这样做。 谢谢

  • 问题内容: 我刚刚在Windows上安装了node.js。我有一个不运行的简单代码: 我得到:错误:听EADDRINUSE 是否有一个 配置文件 告诉node.js在特定端口上侦听? 问题是我已经让Apache监听了端口80。 编辑: 问题答案: 没有配置文件,除非您自己创建一个。但是,端口是函数的参数。例如,侦听端口8124: 如果查找打开的端口时遇到问题,可以转到命令行并输入: 查看每个适配器

  • 有人能提出什么解决办法吗?

  • 变化检测器的目标是知道从上一次变化检测过程运行以来,组件的模板中使用的哪些模型属性已经改变。 为了知道,Angular创建了一个适当的变化检测器类的实例和一个链接到它应该检查的组件。 在我们的示例中,因为我们只有一个和MovieComponent的实例,我们将只有一个MainComponent_ChangeDetector和MovieComponent_ChangeDetector的实例。 下面的

  • 问题内容: 我已经有了这段侦听连接性更改的代码- 我使用此代码检查连接- 但是问题是,如果网络突然失去了互联网连接而没有任何连接更改,则此代码将无用。有什么方法可以创建广播接收器侦听器以更改Internet连接吗?我有一个Web应用程序,突然的Internet连接更改会引起问题。 问题答案: 尝试这个 对于广播接收器 不要忘记将其放入你的AndroidManifest.xml 希望这会为你加油!