Codenameone 如何使属性更改侦听器在Codename One中启动

Codenameone 如何使属性更改侦听器在Codename One中启动,codenameone,Codenameone,我正在尝试更新地图上的用户位置。因此,我对LocationListener的定义如下: public class UserLocationListener implements LocationListener { @Override public void locationUpdated(Location location) { User.getInstance().actualLocation.set(location); } @Override publi

我正在尝试更新地图上的用户位置。因此,我对LocationListener的定义如下:

public class UserLocationListener implements LocationListener {

  @Override
  public void locationUpdated(Location location) {
    User.getInstance().actualLocation.set(location);

  }

  @Override
  public void providerStateChanged(int newState) {

 }

}
ActualAllocation
是以下定义的属性

在模拟器内,如果我使用位置模拟器移动用户位置,则会触发LocationUpdate

现在在我的MainForm类构造函数中,如果我添加:

User.getInstance().actualLocation.addChangeListener((p) -> {
        System.err.println("User location has changed");
        // Update user location on the map
}
虽然映射显示有一个标记(请参见
myMap.addMarker(…)
),但它永远不会被激发

所以我的问题是:为什么这个变更监听器没有被解雇,我应该把它放在哪里才能让所有的工作都顺利进行


感谢您的帮助,

位置代码重用相同的位置对象实例,只更改其中的值。属性中的
set(T)
方法仅在新值
时触发更改事件=旧值:

public K set(T value) {
    if(this.value != value) { 
        this.value = value;
        firePropertyChanged();
    }
    if(parent == null) {
        // allows properties to work even if they aren't registered in the index
        return null;
    }
    return (K)parent.parent;
}
因此,作为一种解决方法,您可以使用以下内容:

public void locationUpdated(Location location) {
  Location l = new Location();
  l.setLatitude(location.getLatitude());
  ... // etc. sucks that we don't have new Location(location)
  User.getInstance().actualLocation.set(l);
}

我不确定我们需要它是否是错误的。

您能验证
actualallocation
的值是否已设置吗?通过调用
System.println(User.getInstance().actualLocation.get())
在您的
locationUpdated
。您好,谢谢您的建议。事实上,它是随着
位置
而发展的,我检查过了。但是changeListener不会触发。谢谢Shai!要使其触发,我首先
set(new Location())
,然后
set(Location)
。这样可以避免将
位置的所有字段
复制到
l
中。我同意
位置(Location)
会很方便!在我看来,在这种情况下使用
!this.value.equals(value)
而不是
this.value!=值
对于FireProperty更改是有意义的。因此,
set(T值,布尔forceObjectEqualityCheck)
可能会有所帮助。这将导致事件触发两次,并可能导致“反弹”效果。由于我们正在更改基础对象,因此equals调用仍将返回true。是的,我知道触发两次的事件,因此我首先将其设置为
null
,然后将其设置为
location
。在
propertyChangedListener
中,我检查
actualLocation.get()
是否为
=null
执行代码>操作。您编写了“代码重用相同的位置对象”,因此您没有更改基础对象,是吗?是的。本地实现可能会大量触发位置,因此我们会尽量减少分配。