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

时间:2014-10-22 13:27:37

标签: javafx

我正在创建一系列扩展开箱即用的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中的位置设置值为时尚早。但我无法找到其他任何一点来设置它。

0 个答案:

没有答案