【发布时间】:2014-11-28 10:32:49
【问题描述】:
属性 - ol' 样式 bean 属性与闪烁的 fx 属性相同 - 如果它们相互正交,则效果最佳。如果它们以某种方式相关,它们会带来问题 - 再次,两种类型。这可能比我们喜欢的更频繁地发生在令人讨厌的现实世界中。
以两个selectedIndex/selectedItem为例:如果包含,则索引指向列表中项目的位置,否则为负数。更新一个也需要更新另一个。
对于 java bean,解决方案是 straightforward,因为 bean 本身可以完全控制何时触发更改。而对于 fx bean?
SelectionModel 中使用的基本模式
Property<T> theRealItemProperty = new SimpleObjectProperty<>();
ReadOnlyProperty<T> readOnlyItemProperty = new ReadOnlyObjectProperty(theRealItemProperty);
/**
* Public access is read-only
*/
public final ReadOnlyProperty<T> itemProperty() {
return readOnlyItemProperty;
}
/**
* Setting allowed for subclasses only (and mis-behaving package neighbors ;-)
*/
protected final void setItem(T item) {
theRealItemProperty.set(item);
}
/**
* Special setting api for general public
*/
public void select(T item) {
setIndex(indexOf(item));
setItem(item);
}
属性在调用它们的设置器时触发,bean 无法控制。由于这些调用之间的内部状态不稳定,第一个的侦听器在收到通知时不得访问第二个。因为他们不知道哪个是第一个触发的,所以他们永远不能依赖 bean 的稳定。
现在要做什么,无论是拥有 bean 还是客户端?以某种方式推迟火灾?旧把戏 Platform.runLater() 散布在应用程序代码中?难倒..
【问题讨论】:
-
无论如何,这种形式的SelectionModel 是个坏主意,因为它在下面强制使用基于整数的模型。基本上这应该只是一个属性。例如:我的 JFXtras CalendarPicker 很想实现 SelectionModel,但由于它没有整数的概念,所以不能。也就是说,相关属性的基本问题并没有用那句话解决。也许他们应该有一个“推迟事件”的方法。
-
@tbeernot 不要让我开始使用 SelectionModel ;-) 感谢您的评论,一直在考虑类似的思路(但无济于事)
-
Tomas Mikula 将此作为其ReactFX 框架的一部分。
-
@James_D 感谢您的参考!尚未查看代码,但在描述中偶然发现“无效侦听器按照注册的顺序执行” - 对我来说听起来像是假设/实现细节,还是在某处指定了通知序列?
标签: java properties javafx-8