首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaFX TextField focusProperty on touchScrollEvent

JavaFX TextField focusProperty on touchScrollEvent
EN

Stack Overflow用户
提问于 2015-11-02 12:19:39
回答 1查看 343关注 0票数 2

如果用户单击MyExtendedTextField,我将显示一个键盘,代码如下所示。当使用鼠标滚动时,您不会将焦点分散到TextField上,但是当按一下滚动时,焦点就会丢失--当然还有键盘显示器。是否有一种方法可以在touchScroll上获得与mouseScroll上相同的行为?我不想让键盘失去,如果用户是滚动与触摸!

代码语言:javascript
复制
focusedProperty().addListener(new ChangeListener<Boolean>() {

        @Override
        public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue,
                final Boolean newValue) {

                KeyboardUtils.INSTANCE.setVisible(newValue);
        }
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-06 13:55:05

这是非常基本的,先生,当您使用触屏滚动时,您肯定会触摸到一个可滚动的Pane区域,以及Pane requestFocus()的触摸,因此您的TextField将失去它的焦点。

因此,要解决这个问题,如果通过使用该窗格或节点的滚动侦听器,或者使用setOnTouchStationary()setOnTouchReleased()来帮助调整键盘的可见性,而不是躺在TextField的焦点上,就可以将焦点发送回您的TextField

编辑

尝尝这个

代码语言:javascript
复制
Node lastFocusedNode =null; // lastly known node to have focus
//now every node or child in your ScrollPane or Scrollable parent 
//that you care about will have a focusable listener-including
// your textfield
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(
        ObservableValue<? extends Boolean> observable,
                Boolean oldValue, Boolean newValue) {
                if(!newValue){//if they loose focus
                    lastFocusedNode = textField;
                    //if they loose focus attach them to lastFocusedNode
                }
            }
        });
 //the above saves you iterations

然后,当您的ScrollPane/滚动节点接收到焦点时,您将它们设置为lastFocusedNode,因为它只允许滚动。

代码语言:javascript
复制
sp.focusedProperty().addListener(new InvalidationListener() {               
            @Override
            public void invalidated(Observable observable) {
                if (lastFocusedNode != null) {
                    lastFocusedNode.requestFocus();
                }
            }
        });

以上假设您的ScrollPane将不会做任何消耗除了滚动之外的事情。

如果您的ScrollPane/父级不符合这个假设,那么您可以使用这种方法--检测用户在触摸可滚动节点的内容区域后何时滚动--只有当用户在触摸后尝试滚动时才有效。

代码语言:javascript
复制
//approach loaded
final InvalidationListener lis = new InvalidationListener() {               
@Override
public void invalidated(Observable observable) {
    //here it is changing
    if(sp.isFocused())
        lastFocusedNode.requestFocus();//take the focus away
    }
};

使用上面的失效侦听器,在hvalueProperty()和vvalueProperty()或ScrollPane上设置它--您使用的是哪个可滚动的父级?

代码语言:javascript
复制
sp.hvalueProperty().addListener(lis);
sp.vvalueProperty().addListener(lis);

那你就完了。以上任何一种解决方案都不会造成任何问题。

编辑2

据我所知,TouchEvent是用于支持触摸的计算机的,因此可能与MouseEvent一起使用,您可以检测Pane.setOnMousePressed();等etcc。

希望它能帮上忙

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33477429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档