我有一个枚举:
public enum TimelineState {
PLAY,
PAUSE,
STOPPED,
FINISHED
}
然后我有一个对象属性:ObjectProperty<TimelineState>
通过以下方式收听该对象属性:
public class CallFinishedListener implements ChangeListener<TimelineState> {
@Override
public void changed(ObservableValue<? extends TimelineState> arg0,
TimelineState arg1, TimelineState arg2) {
// do stuff
}
}
我也有一个失效监听器:
state().addListener(new InvalidationListener() {
@Override
public void invalidate() {
// do stuff
}
});
当以下函数更改状态时,仅触发失效监听器!(为什么?)
@Override
public void pause() {
this.setState(TimelineState.PAUSE);
}
@Override
public void reset() {
this.movePlayheadTo(new TimeElapsed(0));
}
protected synchronized void finish() {
// At this point, the value is TimelineState.FINISHED
this.pause(); // This changes the state to TimelineState.PAUSE
this.reset();
state.set(TimelineState.FINISHED);
}
我唯一能找到的是这篇博文,含糊地提到改变听众只有在价值“真正改变”时才会激活 http://blog.netopyr.com/2012/02/08/when-to-use-a-changelistener-or-an-invalidationlistener/
答案 0 :(得分:0)
我设法解决了这个问题。问题是该计划完全不同的部分中的一个变更听众是synchronized
。出于某种原因,这导致所有其他更改侦听器无法获取消息,但将InvalidationLister
保留为明文。
如果有人提供有关此方式的信息,我很乐意接受这一点作为答案。