我正在创建一系列扩展开箱即用的JavaFX控件的Node实现。我添加的唯一补充是可以持续并回读控件的状态。
一些扩展类:
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
不是放入代码的最佳位置的想法。但我无法弄清楚任何其他方法。
我覆盖和扩展的方法应该是在显示节点时访问一次的方法,应该在表单加载过程结束后调用(如果所有子节点都可用)。
有人可以建议我应该在哪里投稿吗?
更新
通过在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_是divider.positionProperty
上的ChangeListener,DP是位置设置器跟踪。我设定的值是0.2761904761904762值。看起来,我用正确的值调用setter,它调用SplitPane的setter,它在属性上引发两个调用:首先是对值的调整(注意,旧值已经是我设置的值!)然后第二次使用旧值0.5(它来自哪里?)。在离开布局并完成场景的显示之后,某些东西再次将属性设置为0.5(几乎)。
它表示layoutChildren
中的位置设置值为时尚早。但我无法找到其他任何一点来设置它。