JavaFX:在扩展节点中的何处放置编程配置?
我正在创建一系列扩展开箱即用JavaFX控件的节点实现。我向它们添加的唯一一个功能是持久化并读回控件的状态 一些扩展类:JavaFX:在扩展节点中的何处放置编程配置?,javafx,Javafx,我正在创建一系列扩展开箱即用JavaFX控件的节点实现。我向它们添加的唯一一个功能是持久化并读回控件的状态 一些扩展类: ConfigurableTableView扩展TableView并添加对保存列顺序、可见性、大小和顺序的支持。 ConfigurableSplitPane扩展SplitPane并添加支持以保存分隔器位置 我要做的是在创建时读取配置: @Override protected void layoutChildren() { super.layoutChildren();
ConfigurableTableView
扩展TableView
并添加对保存列顺序、可见性、大小和顺序的支持。
ConfigurableSplitPane
扩展SplitPane
并添加支持以保存分隔器位置
我要做的是在创建时读取配置:
@Override
protected void layoutChildren() {
super.layoutChildren();
// ... reading the config data
// ... adjusting the state of the node
// --- setting up listeners to catch changes and storing it
}
它几乎可以正常工作。一些小问题是,在重绘场景或调整节点大小时调用此方法。所以我给它加了一面旗
@Override
protected void layoutChildren() {
super.layoutChildren();
if (!alreadySet) {
alreadySet = true;
// ... reading the config data
// ... adjusting the state of the node
// --- setting up listeners to catch changes and storing it
}
}
这甚至更接近我想要的,对于桌子来说,它工作得很好。但不知怎的,SplitPane无法工作。当我调试时,我看到分隔器位置值被设置为它们应该设置的值,但是在离开该方法之后,一些东西用它们的默认值覆盖了它们
这就产生了这样一种想法:layoutChildren
并不是放置代码的最佳位置。但是我想不出还有什么其他的方法可以使用
我覆盖和扩展的方法应该是在显示节点时访问一次的方法,应该在表单加载过程结束后调用(如果所有子节点都可用)
有人能建议我应该在哪里捐款吗
更新:
A通过在divider.positionProperty
上添加侦听器和对setDividerPosition
方法的一些跟踪(在调用原始实现之后),进行了更多的调试。以下是日志输出:
======DP before: 0 : 0.2761904761904762
======CL_ 0 : old: 0.2761904761904762 -> new: 0.26785714285714285
======CL_ 0 : old: 0.5 -> new: 0.26785714285714285
======DP after: 0 : 0.2761904761904762
======CL_ 0 : old: 0.26785714285714285 -> new: 0.4984126984126984
这里CL_u是分配器上的ChangeListener。positionProperty是位置设置器跟踪。我要设置的值是0.2761904761904762。看起来,我用正确的值调用setter,它调用SplitPane的setter,它在属性上引发两次调用:首先是值的调整(注意,旧值已经是我设置的值!),然后第二次调用旧值0.5(它来自哪里?)。在离开布局并完成场景的显示后,某些东西再次将属性设置为0.5(几乎)
这表示在layoutChildren
中设置该值为时过早。但我找不到任何其他点来设置它