JavaFX:在扩展节点中的何处放置编程配置?

JavaFX:在扩展节点中的何处放置编程配置?,javafx,Javafx,我正在创建一系列扩展开箱即用JavaFX控件的节点实现。我向它们添加的唯一一个功能是持久化并读回控件的状态 一些扩展类: ConfigurableTableView扩展TableView并添加对保存列顺序、可见性、大小和顺序的支持。 ConfigurableSplitPane扩展SplitPane并添加支持以保存分隔器位置 我要做的是在创建时读取配置: @Override protected void layoutChildren() { super.layoutChildren();

我正在创建一系列扩展开箱即用JavaFX控件的节点实现。我向它们添加的唯一一个功能是持久化并读回控件的状态

一些扩展类:

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
中设置该值为时过早。但我找不到任何其他点来设置它