Javafx 侦听器工作,但绑定不工作';T

Javafx 侦听器工作,但绑定不工作';T,javafx,javafx-8,Javafx,Javafx 8,背景: 根据的公认答案,TextArea有一个底层Text节点,该节点包含文本并充当其边界框。它对于计算文本的视觉(变换前)高度非常有用,即使文本环绕时也是如此 文本节点未在公共JavaFX 8 API中公开,但可以通过.lookup()获取。此外,在渲染场景之后,它似乎才初始化。上面的回答显示了如何通过收听场景成功地获得它 问题: 我采用了侦听器的逻辑,它可以工作,并将其作为绑定实现。但是绑定不起作用,我不明白为什么。侦听器更新的属性值已成功设置为新的文本节点,而绑定的值始终为null,因为它

背景:

根据的公认答案,
TextArea
有一个底层
Text
节点,该节点包含文本并充当其边界框。它对于计算文本的视觉(变换前)高度非常有用,即使文本环绕时也是如此

文本
节点未在公共JavaFX 8 API中公开,但可以通过
.lookup()
获取。此外,在渲染
场景
之后,它似乎才初始化。上面的回答显示了如何通过收听
场景
成功地获得它

问题:

我采用了侦听器的逻辑,它可以工作,并将其作为绑定实现。但是绑定不起作用,我不明白为什么。侦听器更新的属性值已成功设置为新的
文本
节点,而绑定的值始终为null,因为它未检测到
场景
从null到
场景
对象的更改

public ObjectExpression<Text> getObservableTextNode(TextArea textArea) {
    // The underlying text node can be looked up only after applying CSS when there is a scene.
    // For that reason we return it as an observable.

    // Way #1: Listener
    ObjectProperty<Text> property = new SimpleObjectProperty<>();
    textArea.sceneProperty().addListener((observableNewScene, oldScene, newScene) -> {
        if (newScene != null) {
            textArea.applyCss();
            Node text = textArea.lookup(".text");
            property.set((Text) text);
        } else {
            property.set(null);
        }
    });
    return property;

    // Way #2: Binding - does not update
    ObjectBinding<Text> ob = Bindings.createObjectBinding(() -> {
        if (textArea.sceneProperty().get() != null) {
            textArea.applyCss();
            return (Text) textArea.lookup(".text");
        }
        return null;
    }, textArea.sceneProperty());
    return ob;
}
公共对象表达式getObservableTextNode(TextArea TextArea){ //当存在场景时,只有在应用CSS后才能查找底层文本节点。 //因此,我们将其作为可观察对象返回。 //方式1:听众 ObjectProperty属性=新的SimpleObjectProperty(); textArea.sceneProperty().addListener((observableNewScene、oldScene、newScene)->{ if(newScene!=null){ textArea.applyCss(); 节点文本=textArea.lookup(“.text”); 属性集((文本)文本); }否则{ 属性集(null); } }); 归还财产; //方式2:绑定-不更新 ObjectBinding ob=Bindings.createObjectBinding(()->{ if(textArea.sceneProperty().get()!=null){ textArea.applyCss(); 返回(文本)textArea.lookup(“.Text”); } 返回null; },textArea.sceneProperty()); 返回ob; }
就我所知,侦听器和绑定的逻辑是相同的。那么为什么会有区别呢?

这看起来是一个非常丑陋的解决方案。你可能想要准确地描述你想要完成什么(以及为什么)。也许有一个更干净的办法来解决你的问题。这可能是一个。我正在生成文本节点的可观察对象,以便将其传递给将使用它的另一个类。我可以通过听众实现我的目标,但这与我无关。我在这里的兴趣是发现绑定不起作用的具体原因。看看这里:这可能在没有解决方法的情况下解决问题。两种方法对我来说都是一样的。如果你真的想这样做,你能发一个帖子吗?