2015-11-02 85 views
2

如果用户点击进入我的扩展TextField并显示下面的代码,则显示一个键盘。当用鼠标滚动时,您不会将焦点移到TextField,但是当通过触摸滚动时,焦点会丢失 - 当然还有键盘消失。有没有办法在touchScroll上获得与mouseScroll相同的行为?如果用户正在滚动触摸,我不希望键盘消失!JavaFX TextField focusProperty touch on touchScrollEvent

focusedProperty().addListener(new ChangeListener<Boolean>() { 

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

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

回答

1

这是非常基本的先生,当你与一个Touchscroll滚动你肯定轻触滚动Pane区域以及PanerequestFocus()通过触摸,所以你TextField将失去它的焦点。

所以要解决它,你送焦点回到你的TextField如果您发现触摸或者通过使用窗格或节点的滚动监听器或去setOnTouchStationary()setOnTouchReleased(),以帮助调整键盘的可见性,而不是躺在重点是你的TextField

编辑

试试这个

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,因为它只是将允许滚动。上述

sp.focusedProperty().addListener(new InvalidationListener() {    
      @Override 
      public void invalidated(Observable observable) { 
       if (lastFocusedNode != null) { 
        lastFocusedNode.requestFocus(); 
       } 
      } 
     }); 

假设你的ScrollPane将只是没有做任何事情,从滚动消耗一边..

,如果你的ScrollPane /滚动父母不与这样的假设会那么 你去使用这种方法,检测时用户在触摸您的可滚动节点的内容区域后滚动 - 仅当用户在触摸后尝试滚动时才有效。

//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上述无效听众 - 其滚动父您使用的?

sp.hvalueProperty().addListener(lis); 
sp.vvalueProperty().addListener(lis); 

,那么你就完成了。上述任何解决方案都会引起没有problemo

EDIT 2

据我所知TouchEvent是触控功能的电脑,所以也许有MouseEvent去,你可以检测Pane.setOnMousePressed();等ETCC

希望它帮助

+0

感谢您的答案,所以对于每个TouchEvent我需要遍历该窗格的所有子节点以获取被聚焦的节点? (这是可能的,因为TouchEvent请求焦点?然后在发布我requestFocus然后呢?但是,这不是真的不行吗? – Tobi

+0

你会评论吗? – Tobi

+0

让我知道,如果它的好先生@Tobi – Elltz