我有一个ListView,它在它的selectedItemProperty()中添加了一个ChangeListener。如果在侦听器内部存在某些条件是正确的,则可以以某种方式使侦听器失效,例如:
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,那么应该保留实际的视图。因此,在我的情况下,任何禁用元素的建议都是错误的。我在这里找到了一个解决方案,但我不确定它是否是最佳的:
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);
}
};发布于 2017-07-19 17:09:24
因此,有两种解决方案我不建议:
listView.getSelectionModel().select(oldValue);将其设置为旧值,但先注销侦听器,然后再将其注册。listView.getSelectionModel().select(oldValue);,但是设置一个标志,当它再次触发侦听器时检查它。这两种解决方案都容易出错。
因此,我建议的解决方案是,通过删除或更好地禁用列表中的项,阻止用户做出当前没有意义的选择。这将提高应用程序的可用性,因为当用户的选择被取消时,用户不会感到沮丧。
https://stackoverflow.com/questions/45194895
复制相似问题