javafx - 如何禁用不是从用户触发的事件

imm*_*art 1 events javafx

我对javafx有点问题.我添加了一个像这样的更改监听器:

private final ChangeListener<String> pageItemSelected = new ChangeListener<String>()
{
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){
    pageGotSelected(newValue);
}
};
Run Code Online (Sandbox Code Playgroud)

现在问题:如果我更改这样的页面项:

 guiPageList.setValue(model.getCurrentTargetPage());
Run Code Online (Sandbox Code Playgroud)

触发事件(通过用鼠标或键选择某些东西)也会被触发.有没有办法禁用事件发射或其他方式?我只需要事件,如果元素是由用户选择的,而不是我用setValue()函数改变它...也许消耗事件,但我不知道这将是什么样的事件.

提前致谢!!!

Ulu*_*Biy 8

您可以暂时删除侦听器并再次添加:

guiPageList.getSelectionModel().selectedItemProperty().removeListener(pageItemSelected);
guiPageList.setValue(model.getCurrentTargetPage());
guiPageList.getSelectionModel().selectedItemProperty().addListener(pageItemSelected);
Run Code Online (Sandbox Code Playgroud)


And*_*ill 6

或者,您可以使用另一个侦听器实现来修饰侦听器,代码类似于:

class InvalidationListenerEventBlocker implements InvalidationListener {
    InvalidationListener decoratedListener;
    boolean block;
    public void invalidated(Observable observable) {
        if(!block) {
            decoratedListener.invalidated(observable);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为块boolean添加一个setter,并通过构造函数发送监听器.将block设置为true以停止事件.