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