创建TextArea时,您可以收听其#34; focusedProperty"。
但是如果用户触摸TextArea的内部scrollBar(如果它太小),则TextArea的焦点将丢失(因为scrollBar具有焦点)。
但就我而言,TextArea仍然具有焦点,因为scrollBar是部分或TextArea,甚至无法访问它们。
我如何破解textArea以便检测用户何时使用scrollBar?我想破解/创建一个在用户输入文本或使用滚动条时返回true的focusedProperty。
答案 0 :(得分:1)
观察Scene
的{{1}}属性,如果它是文本区域的后代,则创建一个focusOwner
,否则为false:
BooleanBinding
答案 1 :(得分:1)
以下是@ James_D的答案的变体,以防你需要能够从他的答案中获得focus
绑定,而无需参考场景,例如:如果您需要在将文本区域添加到场景之前设置绑定,正在实现库,或者只是想让您的代码更少纠缠。
此解决方案使用EasyBind库方便地选择嵌套属性(从focusOwnerProperty
中选择sceneProperty
)。
public static Binding<Boolean> containsFocus(Node node) {
return EasyBind.monadic(node.sceneProperty())
.flatMap(Scene::focusOwnerProperty)
.map(owner -> {
for (Node n = owner; n != null; n = n.getParent()) {
if (n == node) return true ;
}
return false ;
})
.orElse(false); // when node.getScene() is null
}