更改侦听器未触发

时间:2013-12-23 17:15:42

标签: java multithreading binding javafx

我有一个枚举:

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/

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。问题是该计划完全不同的部分中的一个变更听众是synchronized。出于某种原因,这导致所有其他更改侦听器无法获取消息,但将InvalidationLister保留为明文。

如果有人提供有关此方式的信息,我很乐意接受这一点作为答案。