使用scrollBar时,TextArea会失去焦点

时间:2014-09-30 12:45:45

标签: javafx javafx-8

创建TextArea时,您可以收听其#34; focusedProperty"。

但是如果用户触摸TextArea的内部scrollBar(如果它太小),则TextArea的焦点将丢失(因为scrollBar具有焦点)。

但就我而言,TextArea仍然具有焦点,因为scrollBar是部分或TextArea,甚至无法访问它们。

我如何破解textArea以便检测用户何时使用scrollBar?我想破解/创建一个在用户输入文本或使用滚动条时返回true的focusedProperty。

2 个答案:

答案 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
}