首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFx:使ChangeListener失效

JavaFx:使ChangeListener失效
EN

Stack Overflow用户
提问于 2017-07-19 15:24:35
回答 1查看 756关注 0票数 1

我有一个ListView,它在它的selectedItemProperty()中添加了一个ChangeListener。如果在侦听器内部存在某些条件是正确的,则可以以某种方式使侦听器失效,例如:

代码语言:javascript
复制
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的解决方案,因为它再次考验了listener.Any的想法?

编辑:

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

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

代码语言:javascript
复制
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);
            }
        };
EN

回答 1

Stack Overflow用户

发布于 2017-07-19 17:09:24

因此,有两种解决方案我不建议:

  • 使用listView.getSelectionModel().select(oldValue);将其设置为旧值,但先注销侦听器,然后再将其注册。
  • Alternativley也使用listView.getSelectionModel().select(oldValue);,但是设置一个标志,当它再次触发侦听器时检查它。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45194895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档