繁体   English   中英

JavaFx:使ChangeListener无效

[英]JavaFx: invalidate ChangeListener

我有一个ListView ,并将ChangeListener添加到其selectedItemProperty() 如果在侦听器内部某些条件为真,则可能以某种方式使侦听器无效,例如:

listView.getSelectionModel().selectedItemProperty().addListener(
            (observable, oldValue, newValue) -> {
                if (thereIsUnsavedData()) {
                    // invalidate somehow so to don't change from item A to B 
                } else{
                    // load the content of the newValue
                }
            });

当条件为真时,我可以使该方法不执行任何操作,但仍会更改listView的选择,而这并不是listView.getSelectionModel()。select(oldValue);的解决方案。 因为它再次触发了听众。

编辑:

所以我看到有一些误解,所以让我们澄清一下:

当用户单击listView中不是当前的另一个元素并且当前视图上的未保存数据时,将弹出一个Dialog ,询问用户:是否有未保存的数据,您要继续吗? 是/否答案。 如果用户选择“ 是”,那么一切都很好, 让他更改视图 ,但是如果他选择“ 否” ,则应保留实际视图。 因此,就我而言,禁用元素的任何建议都是错误的。 我在这里找到了解决方案,但不确定是否最佳:

private ChangeListener<Item> changeListener =
        (observable, oldValue, newValue) -> {
            if (thereAreUnsavedData()) {
                listView.getSelectionModel().selectedItemProperty().removeListener(getListener());
                Platform.runLater(() -> {
                    listView.getSelectionModel().select(oldValue);
                    listView.getSelectionModel().selectedItemProperty().addListener(getListener());
                });
            } else {
                loadSelected(newValue);
            }
        };

因此,我不推荐两种解决方案:

  • 使用listView.getSelectionModel().select(oldValue); 将其设置为旧值,但请先取消注册监听器,然后再取消注册。
  • Alternativley还使用listView.getSelectionModel().select(oldValue); 但要设置一个标志,以便在它再次触发侦听器时进行检查。

两种解决方案都容易出错。

因此,我建议的解决方案是通过删除或更好地停用列表中的项目来阻止用户进行当前没有意义的选择。 这将提高应用程序的可用性,因为在撤消选择时不会让用户感到沮丧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM