Events javafx-如何禁用非用户触发的事件

Events javafx-如何禁用非用户触发的事件,events,javafx,Events,Javafx,我对javafx有点问题。我添加了如下更改侦听器: private final ChangeListener<String> pageItemSelected = new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){ page

我对javafx有点问题。我添加了如下更改侦听器:

private final ChangeListener<String> pageItemSelected = new ChangeListener<String>()
{
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue){
    pageGotSelected(newValue);
}
};
 guiPageList.setValue(model.getCurrentTargetPage());
该事件也会被触发(通过使用鼠标或键选择某个对象)。有没有办法禁用事件触发或其他方法? 我只需要事件,如果用户选择了元素,而不是使用setValue()函数更改它。。。 也许是消费活动,但我不知道这会是什么样的活动


提前感谢

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

guiPageList.getSelectionModel().selectedItemProperty().removeListener(pageItemSelected);
guiPageList.setValue(model.getCurrentTargetPage());
guiPageList.getSelectionModel().selectedItemProperty().addListener(pageItemSelected);

您可以临时删除侦听器,然后再次添加它:

guiPageList.getSelectionModel().selectedItemProperty().removeListener(pageItemSelected);
guiPageList.setValue(model.getCurrentTargetPage());
guiPageList.getSelectionModel().selectedItemProperty().addListener(pageItemSelected);

或者,您可以使用另一个侦听器实现来装饰侦听器,代码如下所示:

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

为块布尔值添加一个setter,并通过构造函数发送侦听器。将block设置为true以停止事件

或者,您可以使用另一个侦听器实现来装饰侦听器,代码如下所示:

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

为块布尔值添加一个setter,并通过构造函数发送侦听器。将block设置为true以停止事件

这是一个非常古老的问题,但我找到了一些我个人使用的解决方案,它是可重用的,不需要存储对侦听器的引用(但它需要对exposing/muffling属性的引用)

首先是概念:我们要创建lambda(
invalizationlistener
),只有当上述暴露/消音属性设置为true/false时才会调用它。为此,我们将定义另一个提供所述行为的功能接口:

@functioninterface
专用接口ManagableInvalizationListener
扩展无效侦听器{
公共静态无效侦听器(
布尔属性暴露,
ManagableInvalizationListener(监听器){
返回ob->{
if(expose.get()){
使无效(ob);
}
};
}
公共静态无效侦听器消音(
布尔财产马弗,
ManagableInvalizationListener(监听器){
返回ob->{
如果(!muffle.get()){
无效(ob);
}
}
}
公开摘要无效(可观察ob);
}
这个接口定义了我们将在代码中使用的两个静态方法。我们传递一个转向属性作为第一个参数(它将告诉是否应该调用侦听器)和将在何时调用它的实际实现。请注意,无需扩展
invalizationlistener
,但我希望保持
manageableinvalizationlistener
invalizationlistener
同步

因此,如果需要创建一个(manageable)侦听器,我们将调用
exposing
,如果
expose
属性的值为
true
,该侦听器将通知(无效)侦听器。在另一种情况下,如果转向属性的
true
意味着屏蔽通知,我们将使用
muffling
创建侦听器

如何使用它

/-让我们简化工作并静态导入expose方法
导入静态ManagableInvalizationListener.exposing;
// ...
//-这是转向特性。
BooleanProperty notify=新的SimpleBoleAnProperty(true);
//-这是侦听器的主要属性。
ObjectProperty foobar=新的SimpleObjectProperty();
//-假设我们将通知侦听器,如果
//notify属性设置为true。
addListener(公开(通知,ob->{
//-下面是InvalidListener代码。
}));
然后在代码的某个地方:

/-监听器将像往常一样收到通知。
set(新的foobar());
//-现在暂时禁用通知。
notify.set(假);
//-侦听器这次将不会收到通知。
set(新的foobar());
//-重新启用通知。
notify.set(true);

希望这能有所帮助。您可以随意使用本文中的代码。

这是一个非常古老的问题,但我找到了一些我个人使用的解决方案,它是可重用的,不需要存储对侦听器的引用(但它需要对暴露/消音属性的引用)

首先是概念:我们要创建lambda(
invalizationlistener
),只有当上述暴露/消音属性设置为true/false时才会调用它。为此,我们将定义另一个提供所述行为的功能接口:

@functioninterface
专用接口ManagableInvalizationListener
扩展无效侦听器{
公共静态无效侦听器(
布尔属性暴露,
ManagableInvalizationListener(监听器){
返回ob->{
if(expose.get()){
使无效(ob);
}
};
}
公共静态无效侦听器消音(
布尔财产马弗,
ManagableInvalizationListener(监听器){
返回ob->{
如果(!muffle.get()){
无效(ob);
}
}
}
公开摘要无效(可观察ob);
}
这个接口定义了我们将在代码中使用的两个静态方法。我们传递一个转向属性作为第一个参数(它将告诉是否应该调用侦听器)和将在何时调用它的实际实现。请注意,无需扩展
invalizationlistener
,但我希望保持
manageableinvalizationlistener
invalizationlistener
同步

因此,如果需要创建一个(manageable)侦听器,它将在
expose
属性时通知(无效)侦听器,那么我们将调用
exposing