JavaFx:使ChangeListener无效

时间:2017-07-19 15:24:35

标签: java listview javafx javafx-8 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);
            }
        };

1 个答案:

答案 0 :(得分:0)

所以,我不推荐两种解决方案:

  • 使用listView.getSelectionModel().select(oldValue);将其设置为旧值,但之前取消注册侦听器并在之后注册。
  • Alternativley也使用listView.getSelectionModel().select(oldValue);但设置了一个标志,当你再次触发监听器时,你会检查它。

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

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