【发布时间】:2017-04-13 13:18:41
【问题描述】:
让我们考虑一个示例代码:
SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(0);
simpleIntegerProperty.addListener((observable, oldValue, newValue) -> {
// execution code when the event is fired.
});
当我使用setValue() 方法设置新值时,如果 oldValue 和 newValue 相同,则不会触发该事件。仅当它们不同时。
一个例子:
- 我有一个
ListView<Element>与一个包含一些“元素”的ObservableList<Element>绑定。 - 我可以在应用程序的不同位置添加更多元素。
- 有一个“开始”按钮可以启动一个程序 - 它 遍历列表并对每个元素执行一些操作。
-
Procedure是一个不同的类。它对元素做了一些事情,还包含SimpleIntegerPorperty-currentlyChosenElementIndex以指示当前选择的元素的索引。
在处理当前元素时,我希望 ListView 显示这一点。现在,在此过程中,GUI 被阻止并在ListView 上选择当前元素,同时继续进行。程序结束后,应用程序将currentlyChosenElementIndex 重置为零,这是我遇到问题的索引。过程开始时,第一个元素未被选中,因为应用程序 setValue() 与以前相同。
有什么办法可以改变吗?
【问题讨论】:
-
A
ChangeListener照它所说的去做:它监听变化。如果值未更改,则不会收到通知。您想要在它实际上没有改变值时做出响应的事实表明您的设计在某种程度上是不正确的。您能举例说明为什么需要这样做吗? -
如果您可以将 SimpleIntegerProperty 更改为另一种类型,请查看我的答案;)
-
这听起来就像您在某种意义上不正确地使用了
currentlyChosenElementIndex。如果这表示当前选择的索引,那么如果它等于0,则表示当前选择了索引0处的元素。如果当前选择了 nothing,则应将该值设置为一个特殊值,指示“当前未选择任何内容”(通常使用-1)。因此,这似乎应该通过将其初始化为-1来解决(并确保您的代码处理这种特殊情况,如有必要)。还是我完全误解了这个问题? -
哦,原来存在负数
。谢谢,当然它解决了我的问题。我不知道为什么我认为我只能将其设置为 ListView大小内的数字。 -
在答案中添加了一个示例。